2014-10-04 41 views
2

我很難理解'__init__.py'中聲明的對象是如何導入到其他文件的。在__init__.py中聲明的導入對象

我有這樣一個目錄結構,以便

top/ 
| 
|_lib/ 
    |_ __init__.py 
    |_ one.py 

文件內容如下

LIB/__ init__.py

a=object() 

LIB/one.py

from lib import a 

這是問題所在。如果我從top目錄火蟒外殼,下面的命令運行良好

>>> from lib.one import a 

但是如果我更改目錄top/lib,並在新的Python炮火類似的命令,我得到的錯誤。

>>> from one import a 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "one.py", line 1, in <module> 
    from lib import a 
ImportError: No module named lib 

當然,我可以改變one.py像這樣,這將使一切工作。

from __init__ import a 

但我真的想了解,爲什麼從top目錄,而不是從top/lib導入命令的作品。

謝謝。

回答

3

一般來說,我認爲最好的做法是將數據從模塊/子包中彙集到__init__.py,而不是依賴周圍模塊中__init__.py的數據。換句話說,__init__.py可以使用one.py,但one.py不應使用__init__.py中的數據/函數。

現在,你的問題......

它工作在top因爲蟒蛇做了相對進口(這是在走IIRC python3.x,所以不要依賴於它;-)。換句話說,python在當前目錄中查找模塊或包名稱lib,並導入它。到目前爲止,這一切都很好。運行from lib.one import a第一次進口lib__init__.py),它工作正常。然後它會導入one - lib仍然從one導入正常,因爲它與您當前的工作目錄相關 - 不相對於源文件。

當您進入lib目錄時,python在當前目錄中找不到lib,導致它不可導入。請注意,對於大多數軟件包來說,通過安裝軟件包可以解決這個問題,該軟件包可以放在python可以找到它的地方,而無需將其放在當前目錄中。

+0

這很有道理。謝謝 – Neo 2014-10-04 07:28:34