2013-11-22 579 views
2

我目前擁有的目錄結構的Python:模塊的導入模塊

- module 
    - __init__.py 
    - foo.py 
    - bar.py 

我想使用的功能定義來自foo.pybar.py所以寫了這個:

import module 

module.foo.fooFunction() 
module.bar.barFunction() 

但是我收到錯誤'module' object has no attribute 'foo'。 這裏有什麼問題?

+0

是'init.py'或'__init __。py' ?,它的內容是什麼? – mgilson

+0

是的,這是一個錯字,會編輯它 – rwolst

回答

3

第一,它應該是__init__.py,不init.py。現在,__init__.py是設置你的模塊命名空間。

如果__init__.py爲空,那麼要使用fooFunction,則還需要導入foo。它不會自動進口與module

import module.foo 
module.foo.fooFunction() 

如果你不喜歡,你可以這樣做:

# __init__.py 
import foo 
import bar 

# script 
import module 
module.foo.fooFunction() 

看看發生了什麼呢?由於__init__.py進口foo,因此當您import module時,它會依次將foobar導入到其名稱空間中。因此,當您在腳本中訪問它時,module已將foo子模塊導入其名稱空間。

,你甚至可以直接導入命名到本模塊的命名空間從富或酒吧:

# __init__.py 
from foo import fooFunction 

# script 
import module 
module.fooFunction() 
+0

謝謝,非常好的解釋 – rwolst

0

__init__.py文件(注意下劃線 - 你的沒有它們),你必須import from你的子模塊。

mymod/__init__.py

from mysubmod1 import f 
from mysubmod2 import g 

outside.py

from mymod import f, g 
0

模塊只有一個父文件夾,而不是一個真正的模塊。如果init .py爲空,則必須執行此操作:

import module.foo。

module.foo.foofunc()

0

不要忘記'爲' Python關鍵詞。對於方案

- module 
- __init__.py 
- foo.py 
- bar.py 

另一種解決方案是這樣的:

import module.foo as someAlias 

# this can then be called as 
someAlias.fooFunction() 

其中someAlias可以是任何你選擇。正如你可以看到它比寫出'module.foo.fooFunction()'更詳細。'