Python 3 doesn’t need in this situation?

Suppose I have:


Suppose is an empty file, and is just one line:


Suppose is:

from src import a


Now in both Python 2.7 and Python 3.x, running gives the result (5).

However, if I delete the file, still works in Python 3.x, but in Python 2.7, I get the error:

Traceback (most recent call last):
  File "", line 5, in <module>
    from src import a
ImportError: No module named src

Why does Python 2.7 exhibit different behaviour in this situation?

Best answer

Python 3 supports namespace packages that work without an file.
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.