Python AES-CBC implementation using AES-ECB
Try to follow PEP8. Just a few little things like when assigning defaults to arguments don't put spaces around the =; two spaces between functions and imports; [i : i + 16] -> [i: i + 16]. Very minor stuff but adds up over a larger piece of code.
Avoid assigning variables to small bits of logic if they're only going to be used once. e.g.:

ret = val + chr(remaining).encode() * remaining
return ret


Could become:

return val + chr(remaining).encode() * remaining

Your names could be improved for clarity; avoid using vague names like key, var, data, etc.
I like ternary operators so I'd change encrypt_aes_cbc() to:

padded = pkcs7(data) if pad else data


You can do something similar in decrypt_aes_cbc() with your returns.
In fact, I'd extract the second part of the function to a generator and call it in encrpyt_aes_cbc(). By which I mean:

def gen_encrypted(key, iv):
    """Maybe give this function a better name!"""

    for i in range(0, len(padded), 16): 
        ...
    yield encrypted


Then change the second half of encrypt_aes_cbc() to call that generator. This nicely compartmentalises your code, removes the need for the encrypted list and should be faster. I can explain this more thoroughly if you're confused about yield. 
Your argument block_size=16 in unpkcs7 is not used.
Your indentation is off in pkcs7.
Try to be specific when raising exceptions. What error exactly are you catching? Exceptions also takes a string argument so you can explain the problem. e.g.:

raise IndexError('This is not a valid position in some_list')