python - __init__.py 中未选取 __all__ 变量

标签 python python-2.7

我有一个看起来像这样的__init__.py

__init__.py:

__all__ = ['cooling', 'counters']

我的目录结构如下:

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

当我尝试导入 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')

最佳答案

我认为您可能误解了 __all__ 的作用......

__init__.py中,您想要实际导入所需的模块。例如

# __init__.py
import example_dir.cooling as cooling
import example_dir.counters as counters
另一方面,

__all__ 表示当用户写入 from ... import * 时应导入当前模块中的哪些名称。

简而言之,__all__ 与导入的模块无关,只与导入模块后可用的名称有关(并且那么,仅当用户从模块导入所有内容时)。

关于python - __init__.py 中未选取 __all__ 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27850733/

相关文章:

python - Kivy Python 右键单击

python - shapefile中的图层是什么

python - 当 Popen 错误时,子进程的 Popen 关闭在另一个线程中使用的 stdout/stderr 文件描述符

python - traincascade、分类器和 openCV

python - Bash:如何在安装 virtualenvwrapper [不重新启动 shell] 后刷新 shell?

python - 多个账号登录时出现414错误

python - 从两个字典中查找最接近的可能值

python - 如何通过添加到列表列表中使所有列表的长度相同

python-2.7 - i2osp 和 os2ip 的实现

python - 本地与全局进口 python