For this directory hierarchy:
.
├── hello
│ ├── __init__.py
│ └── world
│ └── __init__.py
└── test.py
And the Python source files:
if __name__ == '__main__':
import hello
import world
print("yes you win")
Running test.py with Python 3.4 throws ImportError
saying that module world
is not found, but with Python 2.7 everything is fine.
I know that sys.path
is referenced when searching for the imported modules, so adding the directory hello
to sys.path
eliminates the error.
But in Python 2.7, before importing world
, the directory hello
is not in sys.path
either. What causes this difference? Is there any recursive searching policy applied in Python 2.7?
Python 3 uses absolute imports (see PEP 328 as @user2357112 points out). The short of it is that Python 3 searches from the root of each sys.path
entry, rather than first consulting the module's directory as if it were a prepended entry in sys.path
.
To get the behavior you want you can either:
from . import world
in the hello
packageimport hello.world