2010-07-23 40 views
3

我有一個像這樣的py文件,出錯了。Python導入不一致的行爲

from world import acme 

def make_stuff_happen(): 
    acme.account.foo()  # Works 
    acme.subscription.bar() # FAIL: "module 'object' has no attribute 'subscription'" 

make_stuff_happen() 

但這個工程!

from world import acme 
from world.acme import subscription 

def make_stuff_happen(): 
    acme.account.foo() # Works 
    subscription.bar() # Now this works. 

make_stuff_happen() 

我只能說是WTF,可能是什麼原因造成的? 行爲應該至少對acme.accountacme.subscription一致。

謝謝!極致文件夾的

更新 - 文件夾結構:

acme 
|-- __init__.py 
|-- account.py 
|-- catalog.py 
|-- core.py 
|-- proxy.py 
|-- subscription.py 
`-- utils.py 

而且__init__.py是完全空白的。

+0

請告訴我們您的文件夾結構如何:是'acme'目錄還是文件?如果它是一個目錄,那麼當你導入acme時,你正在導入'acme/__ init __。py'',它可能沒有'subscription'。 – Escualo 2010-07-23 16:56:16

+0

我更新了信息 – adamJLev 2010-07-23 17:01:14

回答

6

子模塊在模塊文件夾中的__init__.py文件中引用。看起來subscription沒有在acme__init__.py中被引用。

但是,當您做import world.acme.subscription時,它知道要在該文件夾中進行挖掘而不與__init__.py通話。

根據您對__init__.py的描述爲空,您應該在__init__.pyimport subscription

有關如何設置模塊的更多信息,請參見documentation。有一個很好的例子來設置一個聲音模塊。

+0

這是有道理的,但在這種情況下'acme/__ init __。py'文件是空的 – adamJLev 2010-07-23 17:00:35

+2

這就是問題所在。在'__init __。py'中,你應該「包含訂閱」 – 2010-07-23 17:01:15

+0

準確地說 - 因爲你的'__init __。py'是空的,它不會引用訂閱,這意味着你需要直接導入它。 – 2010-07-23 17:03:02