对于此目录层次结构:
.
├── hello
│ ├── __init__.py
│ └── world
│ └── __init__.py
└── test.py
Python源文件:
if __name__ == '__main__':
import hello
import world
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中应用了递归搜索策略?
答案 0 :(得分:10)
Python 3使用绝对导入(请参阅PEP 328,因为@ user2357112指出)。缺点是Python 3从每个sys.path
条目的根目录进行搜索,而不是首先查询模块的目录,就好像它是sys.path
中的前置条目一样。
要获得您想要的行为,您可以:
from . import world
包hello
import hello.world