2013-07-03 78 views
2

我有以下文件:Python的進口所有模塊對象

./main.py 
./lib/__init__.py 
./lib/lib.py 

$ cat lib/lib.py 

def method(): 
    return 'method' 

$ cat lib/__init__.py 

from .lib import * 

$ cat main.py 

import lib 

def main(): 
    print(lib.lib) 

if __name__=='__main__': 
    main() 

我不知道爲什麼lib.lib被定義,它不是lib.py文件中的變量。 有什麼建議嗎?

+0

它看起來像你試圖引用lib.py文件,當你應該試圖從lib文件中使用功能。即'lib.somelibfunction()'... – John

+0

你有兩個'cat main.py'行;我認爲*第一個應該是真正的'cat lib/lib.py'。 –

回答

3

lib.lib對象是lib包內的嵌套lip.py文件。

一旦導入子模塊,它也變得可用作爲包(除非你包括在__init__.py文件lib名的一個屬性。

Python的3.3模塊加載器(其上實現在Python)簡單地設置一個nested module as an attribute on the parent

# [find a loader and load the module object, setting sys.modules[name]] 
module = sys.modules[name] 
if parent: 
    # Set the module as an attribute on its parent. 
    parent_module = sys.modules[parent] 
    setattr(parent_module, name.rpartition('.')[2], module) 

此行爲是或多或少暗示在Python packages documentation

所有模塊都有一個名稱。子包名稱通過點與父包名分開,類似於Python的標準屬性訪問語法。因此,您可能有一個名爲sys的模塊和一個名爲email的程序包,該程序包又具有一個名爲email.mime的子包和該子包中名爲email.mime.text的模塊。

+0

謝謝,你能指出我在文檔中該行爲被指定的地方嗎? – simonzack

+0

@simonzack閱讀[相對導入](http://docs.python.org/2/tutorial/modules.html#intra-package-references),還有[packages](http://docs.python.org /2/tutorial/modules.html#packages) – John

+0

@simonzack http://www.python.org/doc/essays/packages.html – JAB