Python动态导入和__all__

时间:2014-10-25 00:00:10

标签: python dynamic import loading

即使通过我认为这是一个非常基本的问题,我也面临着一种我不理解的行为......

想象一下,你有一个包含模块mypackage的python包mymodule,包含2个文件__init__.pymy_object.py。上一个文件包含一个名为MyObject的类。

我正试图在__init__.py内修改一个等同于:

的自动导入

__初始化__。PY

__all__ = ['MyObject']
from my_object import MyObject 

为了能够做到:

from mypackge.mymodule import MyObject

我想出了一个解决方案,用所有类的名称填充所有。它使用__import__(也尝试了importlib.import_module()方法),但当我尝试从MyObject导入mymodule时,它会一直告诉我:

ImportError: cannot import name MyObject

这是我开始使用的脚本:

classes = []
for module in os.listdir(os.path.dirname(__file__)):
    if module != '__init__.py' and module[-3:] == '.py':

        module_name = module[:-3]
        import_name = '%s.%s' % (__name__, module_name)

        # Import module here! Looking for an equivalent to 'from module import MyObject' 
        # importlib.import_module(import_name)  # Same behaviour
        __import__(import_name, globals(), locals(), ['*'])

        members = inspect.getmembers(sys.modules[import_name], lambda member: inspect.isclass(member) and member.__module__.startswith(__name__) )

        names = [member[0] for member in members]
        classes.extend(names)

__all__ = classes

有人可以帮助我吗?

非常感谢,

1 个答案:

答案 0 :(得分:0)

您只需要在模块上分配属性:globals().update(members)