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
对于此目录层次结构:
.
├── 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