2011-04-26 56 views
5
包導入困境

我的結構是這樣的:在Python

companynamespace/ 
    __init__.py 
    projectpackage/ 
    __init__.py 
    somemodule.py 

companynamespace/__init__.py爲空

projectpackage/__init__.py有這樣一行:

import companynamespace.projectpackage.somemodule as module_shortname 

當我打開了一個Python控制檯,然後輸入import companynamespace.projectpackage( PYTHONPATH爲此設置正確),我在import companynamespace.projectpackage.somemodule as module_shortname行上獲得AttributeError: 'module' object has no attribute 'projectpackage'。如果我刪除as module_shortname部分(並在文件的其餘部分進行所有必需的替換),則所有內容均正確導入。

誰能告訴我這是爲什麼?我的Google-Fu失敗了。

回答

5

有一個在projectpackage/__init__.py不需要絕對的進口,做一個相對

import somemodule as module_shortname 

你這樣做(絕​​對進口)的方式,將導致循環進口,不很好地工作在Python中。當您導入模塊時,您還要調用父模塊的__init__.py。在你的情況下,絕對導入你也在projectpackage/__init__.py呼籲projectpackage/__init__.py

+0

診斷(即循環導入問題)是正確的,但解釋和建議的解決方案並不完全正確。當執行'projectpackage/__ init __。py'時,'companynamespace'中的'projectpackage'屬性尚未設置,因此會引發特定的錯誤。對於當前的Python,顯式相對導入('from。import somemodule')是比依賴隱式相對導入更好的選擇。 – ncoghlan 2011-04-27 05:26:26

+0

血淋淋的細節可以在http://bugs.python.org/issue992389 – ncoghlan 2011-04-27 05:28:25

+0

感謝mil,我想到了一個循環導入問題,但不知道Python必須解決它的功能。 – 2011-04-29 00:25:33

1

那麼,根據PEP 221你的代碼似乎是合法的。這可能是一個錯誤。下面的解決方法,這相當於該表達的,對我的作品(Python的2.6.6):

from companynamespace.projectpackage import somemodule as module_shortname 

希望它能幫助。