2011-05-23 166 views
1

可能重複:
Python package structure進口蟒蛇文件

你好, 我期待導入我有一個子目錄一個Python文件,是的根目錄下我的主要文件。例如

import ../library/utils.py 

當我把它放到我的代碼並運行它時,我得到一個編譯錯誤。

有沒有一種方法可以從主文件根目錄下面包含文件,還是必須位於根目錄下的子目錄中?

感謝您的幫助。

+0

謝謝你沒有看到那一個。 – Nalum 2011-05-23 21:20:06

回答

3
import sys, os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'library'))) 

import utils 

這將修改包含目錄搜索文件的sys.path的變量。這也將確保它會即使您運行它正確地找到它:

$ python the_file.py 
$ python ../the_file.py 
$ python /somewhere/over/the_file.py 

這將爲東西合作下開發,測試,培訓。安裝的文件不需要這樣的結構。

+0

這比Cat的答案稍微不準確,因爲它試圖計算正確的絕對路徑來添加到sys.path,而不是假定進程工作目錄將與Python包的基礎相同。但是,它仍然不正確,因爲'__file__'可能不會反映源的實際安裝位​​置(字節碼通常內置在臨時構建目錄中,然後重新定位到安裝目錄)。它也無法用於雞蛋和zip文件。 – 2011-05-23 21:22:33

+2

哇,你的100%解決方案顯得非常酷! – Andrew 2011-05-23 21:27:15

+0

只需使用一些zc.recipe.egg構建正確的路徑:-) ...可能有點矯枉過正。 – kriss 2011-05-26 08:44:35

9

您不導入文件,您導入模塊。相應地修改sys.path,並做import utils,例如

import sys 
sys.path.append('../library') 
import utils 
+1

這將起作用,但不以位置獨立的方式。 – Andrew 2011-05-23 21:13:54

+0

我爲什麼只應該導入模塊。例如,我得到了一個名爲credentials.py的文件,其中包含我在很多腳本中需要的數據庫憑據。所有腳本都使用導入憑證並訪問credentials.py中定義的變量。這是不好的做法嗎?有什麼建議? – Hyperboreus 2011-05-23 21:13:56

+0

@Hyperboreus - 採取這種方式 - 您導入的任何文件都是模塊。關於練習,以及..我也是這樣:) – tmg 2011-05-23 21:18:43