2012-01-16 158 views
3

假設我有以下的(PROJECT1是蟒蛇路徑上):如何將Python模塊導入與導入模塊名稱相同的包中?

/project1/utils/utils.py 
    def cool_function(): 
     print "cool" 

/project1/backup/utils.py 
    from utils.utils import cool_function 

這將引發 「導入錯誤:沒有模塊名爲utils」。

我認爲這是因爲它正在backup.utils中搜索utils.cool_function。有沒有重命名utils軟件包?我認爲我的命名習慣是有道理的,而且很自然,所以我不願意改變它。如果這是首選和標準做法,我會重新命名它!

謝謝!

編輯:我正在使用Python 2.7

回答

1

如果project1是一個包(父目錄位於sys.path並且有__init__.py),則可以執行from project1.utils.utils import cool_function。另見PEP328,即new in python 2.5。如果您使用2.5或更高版本,則from ..utils.utils import cool_function也可能工作。

+0

我也覺得這是做一個好辦法。使用project1來區分; project1.utils.utils和project1.backup.utils。如果project1在sys.path中,如你所說,如果你想從其他文件夾運行該項目,如:python folder1/folder2/project1/run.py – Bogdan 2012-01-16 14:22:22

+0

其實,/ project1 /位於路徑中,所以導入時我可以直接引用備份或utils。應該把它們放在一個包裝包中? – cammil 2012-01-17 13:46:09

+0

在許多情況下,這是一個判斷的呼聲,但作爲一般規則,我會說是的 - 如果您需要將此項目與其他人整合,那麼它們會有問題,如果他們還有'utils'或'backup'頂級包。這通常不會發生 - 但這是出於這個原因。 – AdamKG 2012-01-17 13:52:44

0

對我很好用。

用下面的項目結構:

project/ 
|-- run.py 
`-- utils 
| |-- __init__.py 
| |-- utils.py 
|-- backup 
    |-- __init__.py 
    |-- utils.py 

如果你調用從project目錄python3 run.py

編輯:對不起,我剛纔看到這不適用於python-2.x

2

您可以使用relative imports

from ..utils.utils import cool_function 
+0

這不工作!不知道爲什麼,我在發佈到SO之前自己嘗試過。 – cammil 2012-01-17 13:43:41

+0

我試着用Python27並得到「ValueError:試圖相對導入超出頂層包」 – 2012-01-17 14:51:56

相關問題