Python 2.7 和 3.4 之间的包导入差异

Difference in package importing between Python 2.7 and 3.4

对于此目录层次结构:

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

和 Python 源文件:

test.py:

if __name__ == '__main__':
    import hello

hello/__init__.py:

import world

hello/world/__init__.py:

print("yes you win")

运行 test.py with Python 3.4 throws ImportError 表示未找到模块 world,但是 Python 2.7 一切正常很好。

我知道在搜索导入模块时引用了sys.path,所以将目录hello添加到sys.path消除了错误。

但是在Python 2.7中,在导入world之前,目录hello也不在sys.path中。是什么导致了这种差异? Python 2.7 中是否应用了任何递归搜索策略?

Python 3 使用绝对导入(见@user2357112 指出的PEP 328)。简而言之,Python 3 从每个 sys.path 条目的根开始搜索,而不是像 sys.path.[=16= 中的前置条目那样首先查询模块的目录]

要获得您想要的行为,您可以:

  • 显式使用相对导入:hello 包中的 from . import world
  • 使用绝对导入:import hello.world