2016-01-23 103 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會先找到它並嘗試從那裏導入庫。這已經讓我多次陷入困境。

相關問題