2013-10-15 78 views
0

我在導入子包時遇到問題。包裝結構我是:奇怪的Python導入行爲

project/ 
    __init__.py 
    defaults.py 
    helpers/ 
     __init__.py 
     misc.py 

我需要各地項目從defaults.py使用數據,包括helpers\misc.py,而在defaults.py我需要使用一些功能從helpers\misc.py。爲解決循環引用我想是指一切從項目的根,即內部defaults.py我做

import project 

project.helpers.somefunction() 

然而,這是行不通的。

from project.helpers import somefunction 

somefunction() 

但後來我有一個循環引用的問題:當我直接導入功能,這樣它的工作,雖然。 我也有同樣的問題在項目子包中的任何地方,但在其他地方,我可以直接導入子包並解決問題。

那麼,爲什麼它工作,如果我從子包中導入,但不是當我從根包引用相同的子包時?

PS:沒有像這樣的文件與helpers\在同一級別或在裏面。

PPS:整個項目包通過sys.path.insert(0, '<project_abs_path>')

加入sys.path PPPS:Python的2.7.3,Ubuntu的12.04

回答

1
import project.helpers 

project.helpers.somefunction() 
+0

能否請您解釋一下爲什麼這會有所幫助? – Daniel

+1

@Ophion當你導入一個包時,**執行** __init __。py'中的代碼。期。它沒有**導入子包。如果你想自動導入子包,那麼你必須在包的'__init __。py'中這樣做。包就像任何其他模塊一樣。唯一的區別是它在文件系統中的佈局(使用'name/__ init __。py'而不是'name.py')以及執行相對導入的能力。 – Bakuriu