在这种情况下,Python 3不需要__init__.py吗?

时间:2016-01-23 22:23:29

标签: python python-2.7 python-3.x import

假设我有:

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__.pyb.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在这种情况下表现出不同的行为?

1 个答案:

答案 0 :(得分:10)

Python 3支持namespace packages,但没有__init__.py文件。 此外,这些包可以分布在多个目录中。这意味着sys.path上包含*.py个文件的所有目录都将被识别为包。

在导入方面,这打破了Python 3的向后兼容性。典型的问题是当前工作目录中的目录,其名称类似于numpy等库,并且包含Python文件。虽然Python 2忽略了这个目录,但Python 3会首先找到它并尝试从那里导入库。这几次咬了我一下。