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

时间:2015-05-14 23:26:58

标签: python python-2.7 import package python-3.4

对于此目录层次结构:

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

Python源文件:

test.py:

if __name__ == '__main__':
    import hello

你好/ __ INIT __ PY:

import world

你好/世界/ __ INIT __ PY:

print("yes you win")

使用Python 3.4运行test.py会导致ImportError说找不到模块world,但是使用Python 2.7一切都很好。

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

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

1 个答案:

答案 0 :(得分:10)

Python 3使用绝对导入(请参阅PEP 328,因为@ user2357112指出)。缺点是Python 3从每个sys.path条目的根目录进行搜索,而不是首先查询模块的目录,就好像它是sys.path中的前置条目一样。

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

  • 明确使用相对导入:from . import world
  • 中的hello
  • 使用绝对导入:import hello.world