假设我有:
src/
__init__.py
a.py
b.py
假设__init__.py
是一个空文件,而a.py
只是一行:
TESTVALUE = 5
假设b.py
是:
from src import a
print(a.TESTVALUE)
现在在Python 2.7和Python 3.x中,运行b.py
会得到结果(5
)。
但是,如果我删除文件__init__.py
,b.py
仍可在Python 3.x中运行,但在Python 2.7中,我收到错误:
Traceback (most recent call last):
File "b.py", line 5, in <module>
from src import a
ImportError: No module named src
为什么Python 2.7在这种情况下表现出不同的行为?
答案 0 :(得分:10)
Python 3支持namespace packages,但没有__init__.py
文件。
此外,这些包可以分布在多个目录中。这意味着sys.path
上包含*.py
个文件的所有目录都将被识别为包。
在导入方面,这打破了Python 3的向后兼容性。典型的问题是当前工作目录中的目录,其名称类似于numpy
等库,并且包含Python文件。虽然Python 2忽略了这个目录,但Python 3会首先找到它并尝试从那里导入库。这几次咬了我一下。