Difference in package importing between Python 2.7 and 3.4

∥☆過路亽.° 提交于 2019-11-27 17:44:49

问题


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?


回答1:


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


来源:https://stackoverflow.com/questions/30249119/difference-in-package-importing-between-python-2-7-and-3-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!