2011-08-26 51 views
4

我注意到我已經提出了大約5個問題,詢問有關相關進口,每個都有工作解決方案,但有不同的情況。我閱讀的文檔越多,越多地嘗試不同的案例越多,我越來越困惑,並質疑我是否正確地閱讀了單詞。更多相關進口奇怪:..記號

從PEP 328:

A single leading dot indicates a relative import, 
starting with the current package. Two or more leading dots 
give a relative import to the parent(s) of the current package, 
one level per dot after the first. 

我的理解是, 「當前包」 是關鍵字在這裏。什麼是「當前套餐」?它是執行開始的模塊包嗎? (即:__名稱__ ==「__ main __」的文件)。

無論如何,這裏是我使用..表示法的簡單情況。

 
main/ 
    lib/ 
    __init__.py 
    myLib.py 
    plugin/ 
    __init__.py 
    needLib.py 
    run.py 

run.py進口needLib:from plugin import needLib

needLib進口MYLIB:from ..lib import myLib

發生了什麼事在我的腦海:(needLib)上升一個包,進入lib下,搶MYLIB

下面是我如何執行:python run.py

結果:試圖相對導入超越頂層包年齡

但是,當我將導入電話更改爲from .lib import myLib時,它工作。

我不明白爲什麼後者的作品和..表示法沒有。當然,main是不是一個包,所以怎麼樣我只是在一個init.py有奉送,導致

 
main/ 
    lib/ 
    __init__.py 
    myLib.py 
    other/ 
    __init__.py 
    needLib.py 
    __init__.py 
    run.py 

但是,這並沒有區別;仍然在嘗試導入超出頂層包

退房這個問題:python: forcing relative imports to search from script file

..符號確實工作!現在我想到了,我不明白它爲什麼起作用。該場景中的執行從相對導入發生的地方開始2級,而在此場景中的執行從相對導入發生的地方開始1級。除了我開始執行的地方外,情況完全相同。

兩者都是我說的「去一個目錄,進入lib包,並抓住你想要的模塊」。

這種情況與參考情況的關鍵區別是什麼?爲什麼..在那裏工作,但不在這裏?我使用2.6有什麼關係嗎?或者也許我是如何執行它? python run.py

回答

3

正如您發現的那樣,from ..lib import myLib不起作用main不是一個包。相對導入只能在模塊自己的包內工作。在你的例子中,libother是兩個不同的軟件包。

一個__init__.pymain把只有當你移動run外新建main包,使當前目錄(的sys.path部分)包內的工作。