__all__ 未在 __init__.py 中选取变量
__all__ variable not picked up in __init__.py
我有一个 __init__.py
看起来像这样
__init__.py
:
__all__ = ['cooling', 'counters']
我的目录结构如下:
example_dir/
__init__.py
cooling.py
power.py
counters.py
当我尝试 import example_dir
时,python 不会导入 cooling
和 counters
。它什么都不导入。使用 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')
我认为您可能误解了 __all__
的作用...
在__init__.py
中,您想实际导入您想要的模块。例如
# __init__.py
import example_dir.cooling as cooling
import example_dir.counters as counters
另一方面,__all__
表示当用户编写 from ... import *
.
时应导入当前模块中的哪些名称
简而言之,__all__
与导入的modules无关,只有names导入后可用导入模块(然后,仅当用户从模块导入 所有内容 时)。
我有一个 __init__.py
看起来像这样
__init__.py
:
__all__ = ['cooling', 'counters']
我的目录结构如下:
example_dir/
__init__.py
cooling.py
power.py
counters.py
当我尝试 import example_dir
时,python 不会导入 cooling
和 counters
。它什么都不导入。使用 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')
我认为您可能误解了 __all__
的作用...
在__init__.py
中,您想实际导入您想要的模块。例如
# __init__.py
import example_dir.cooling as cooling
import example_dir.counters as counters
另一方面,__all__
表示当用户编写 from ... import *
.
简而言之,__all__
与导入的modules无关,只有names导入后可用导入模块(然后,仅当用户从模块导入 所有内容 时)。