2015-01-08 99 views
1

我有一個__init__.py看起來像這樣__all__變量未拿起在__init__.py

__init__.py

__all__ = ['cooling', 'counters'] 

我的目錄結構如下:

example_dir/ 
    __init__.py 
    cooling.py 
    power.py 
    counters.py 

當我嘗試import example_dir,python不會導入coolingcounters。它什麼都不輸入。使用Pdb,我發現它讀取__init__.py,但它拒絕讀取__all__變量。

我用imp.load_module加載模塊

我的整個程序:

def import_module(name, path=None): 
    parts = name.split('.') 
    module_name = "" 
    for index, part in enumerate(parts): 
     module_name = part if index == 0 else '%s.%s' % (module_name, part) 
     if path is not None: 
      path = [path] 
     fh, path, descr = imp.find_module(part, path) 
     mod = imp.load_module(module_name, fh, path, descr) 
    return mod 


def load_module(name): 
    try: 
     mod = None 
     mod = sys.modules[name] 
    except KeyError: 
     mod = import_module(name) 
    finally: 
     if not mod: 
      raise ImportError('unable to import module %s' % name) 
     return mod 

load_module('example_dir') 
+1

'__all__'與導入包內的嵌套模塊沒有任何關係。 –

回答

2

我想你可能會誤解什麼__all__呢......

__init__.py,要真正地進口你想要的模塊。例如

# __init__.py 
import example_dir.cooling as cooling 
import example_dir.counters as counters 

__all__,從另一方面說,當用戶寫from ... import *應該導入在當前模塊中什麼名字。

總之,__all__無關什麼模塊得到進口,只有一個模塊導入後(然後,只有當用戶輸入一切從模塊)什麼可用。

+0

謝謝。我想我誤解了\ __全部的目的 所以我的問題是,我該怎麼做才能達到我想要的結果?如果我想說load_module('example_dir')並且只導入了冷卻? 添加一個來自example_dir的導入*? –