动态加载Python模块

Ian*_*Ian 3 python module loading dynamic

我正在尝试动态加载我创建的模块.

现在这可以正常工作:

import structures.index
Run Code Online (Sandbox Code Playgroud)

但如果我通过动态导入它来尝试同样的事情,它就会失败.

struct = __import__("structures.index")
Run Code Online (Sandbox Code Playgroud)

提供的错误是:

Error ('No module named structures.index',)
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?


编辑:使用完整范围时(它有用吗?):

struct = __import__("neoform.structures.index")
Run Code Online (Sandbox Code Playgroud)

这不会引发任何错误,但是,它没有加载索引模块,而是加载"neoform"模块.

"struct"的结果是:

<module 'neoform' from '/neoform/__init__.py'>
Run Code Online (Sandbox Code Playgroud)

另外,作为一个附带问题,我如何在动态加载的模块中实例化一个类?(假设所有模块都包含一个公共类名).

编辑:解决方案:(感谢coonj和Rick)这最终成功了.不知道为什么(还),但fromlist必须是"任何东西显然,因为当我把字母"a"作为一个值时它起作用(奇怪的是,假设文件中只有1个类).

def get_struct_module(self, name):
    try:
        return = __import__("neoform.structures." + name, fromlist='*')
    except ImportError, e:
        self.out.add("Could not load struct: neoform.structure." + name + "\n\n" + "Error " + str(e.args))
Run Code Online (Sandbox Code Playgroud)

Ric*_*and 10

我不确定"它失败"意味着什么,所以我只是提到它__import__('structures.index')应该实际上工作,但它不会在当前范围内分配模块名称.要做到这一点(然后在动态导入的模块中使用一个类),你将不得不使用:

structures = __import__('structures.index')
structures.index.SomeClass(...)
Run Code Online (Sandbox Code Playgroud)

完整的详细信息__import__在此处获得.

编辑:(基于问题编辑)

要导入neoform.structures.index和返回index模块,您将执行以下操作:

structures = __import__('neoform.structures.index', 
                        fromlist=['does not in fact matter what goes here!'])
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个包名列表packages,则可以使用以下代码导入其index模块并MyClass为每个模块实例化一些类:

modules = [ __import__('neoform.%s.index' % pkg, fromlist=['a']) 
            for pkg in packages ]
objects = [ m.MyClass() for m in modules ]
Run Code Online (Sandbox Code Playgroud)