Difference in package importing between Python 2.7 and 3.4

PJ.Hades picture PJ.Hades · May 15, 2015 · Viewed 9.8k times · Source

For this directory hierarchy:

.
├── hello
│   ├── __init__.py
│   └── world
│       └── __init__.py
└── test.py

And the Python source files:

test.py:

if __name__ == '__main__':
    import hello

hello/__init__.py:

import world

hello/world/__init__.py:

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?

Answer

Sean Vieira picture Sean Vieira · May 15, 2015

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:

  • Use relative imports explicitly: from . import world in the hello package
  • Use an absolute import: import hello.world