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

Mic*_*rie 6 python import python-2.7 python-3.x

假设我有:

src/
    __init__.py
    a.py
b.py
Run Code Online (Sandbox Code Playgroud)

假设__init__.py是一个空文件,a.py只是一行:

TESTVALUE = 5
Run Code Online (Sandbox Code Playgroud)

假设b.py是:

from src import a

print(a.TESTVALUE)
Run Code Online (Sandbox Code Playgroud)

现在在Python 2.7和Python 3.x中,running都b.py给出了result(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
Run Code Online (Sandbox Code Playgroud)

为什么Python 2.7在这种情况下表现出不同的行为?

Mik*_*ler 10

Python 3支持在没有文件的情况下工作的命名空间包__init__.py.此外,这些包可以分布在多个目录中.这意味着sys.path包含*.py文件的所有目录都将被识别为包.

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