2011-07-19 139 views
0

我想知道如何導入一個級別的文件。 我在谷歌這個閱讀:Python,從父目錄導入一個模

>>> sys.path.append("../") 

但我不喜歡它,我希望有一個更好的解決方案

+2

這就是文件系統的工作原理。 –

回答

3

另一種選擇,如果你正在寫的一個包的一部分,是使用相對進口像這樣:

from .. import foo 

其中foo是您要導入的模塊的名稱。

同樣,如果你有在當前目錄中的另一個模塊,您可以使用:

from . import bar 

可悲的是(或許不那麼傷心),但是,這並不比任何進一步的擴展這個。你不能去祖父母或更高。

編輯

至於如此慷慨指出的JAB,我最後的評論還沒有真正:

從... SYS導入路徑

注意的是,雖然去年案件是合法的,它肯定是不受歡迎的(「瘋狂」是Guido使用的詞)。

我必須內化Guido對它的描述太多。 ; ^)

編輯

好吧,我只是證實了這一在2.7 - 這顯然是去深如你喜歡,是依賴於.

from .... import greatgrandparent 

作品juuuust數精細。我想我需要a bucket

+0

「你不能去祖父母,或更高。」 PEP 328似乎暗示你可以。 HTTP://www.python。org/dev/peps/pep-0328 /#guido-s-decision – JAB

+0

我剛剛證實你可以(在Python 3中,至少;它不應該與Python 2有所不同,因爲這個相對的import語法已經實現在第一個版本中)。 – JAB

+0

「我一定已經內化了Guido對它的描述太多了; ^)」Guido的描述不是指使用相對導入語法從標準Python模塊導入項目嗎? (我的意思是,當相對導入從內置的Python模塊中獲取某些內容時,它會變得非常愚蠢,因爲它更合理,而且更合乎邏輯,只需對這些模塊進行絕對導入)。 – JAB

0

根據項目的組織方式,您可能可以正常導入它。比方說你的項目結構是這樣的:

from mymodule import helper 

/tmp/test_prj/launcher.py 
/tmp/test_prj/mymodule/__init__.py 
/tmp/test_prj/mymodule/helper.py 
/tmp/test_prj/mymodule/mysubmodule/__init__.py 

如果(在這種情況下launcher.py)使用一個發射器和總是調用與./launcher.py您的項目,您使用以下行可能進口helper.pymysubmodule

這是可行的,因爲你當前的工作目錄是/tmp/test_prj。你可以用print sys.path來檢查它,它應該是第一個。

讓我知道如果我不夠清楚:D