Suppose I have:
src/ __init__.py a.py b.py
__init__.py is an empty file, and
a.py is just one line:
TESTVALUE = 5
from src import a print(a.TESTVALUE)
Now in both Python 2.7 and Python 3.x, running
b.py gives the result (
However, if I delete the file
b.py still works in Python 3.x, but in Python 2.7, I get the error:
Traceback (most recent call last): File "b.py", line 5, in <module> from src import a ImportError: No module named src
Why does Python 2.7 exhibit different behaviour in this situation?
Python 3 supports namespace packages that work without an
Furthermore, these packages can be distribute over several directories. This means all directories on your
sys.path that contain
*.py files will be recognized as packages.
This breaks backwards compatibility in Python 3 in terms of imports. A typical problem is a directory in your current working directory that has a name like a library such as
numpy and that contains Python files. While Python 2 ignores this directory, Python 3 will find it first and tries to import the library from there. This has bitten me several times.