2016-01-23 104 views
5

假设我有:在这种情况下,Python 3不需要__init__.py?

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版展现在这种情况下,不同的行为?

回答

8

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

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

相关问题