从动态加载的模块中实例化 类

Instancing classes from dynamically loaded modules

从磁盘上的 python 源代码文件动态加载 classes 的最佳方法是什么? (意思是我不能只是 import className

到目前为止,我已经能够将源代码加载到内存中并使用以下命令从中创建一个 python 模块对象:

spec = importlib.util.spec_from_file_location(modname, sourcepath)
module = importlib.util.module_from_spec(spec)

到目前为止,代码有效。我接下来做的是使用 inspect.getmembers() 函数从加载的模块中仅提取 classes,但是,这就是问题所在,函数 returns 是一个空列表。

classes = inspect.getmembers(module, inspect.isclass)

这段代码实际上在 Python 2 中有效,唯一的区别是我使用 imp 库和 imp.load_source(modname, modpath)) 函数将源文件加载到模块表单中。

我需要这段代码是为了 inspect.getmembers 调用 return 特定模块的 classes 列表,或者实现这个动态 class以另一种方式查找。

我这样做的原因是我正在编写一个小程序,以 python classes 的形式加载插件,然后它使用预定义的函数调用进行交互.

折腾了半天,发现解决方法还是挺简单的。

我只需要像这样更改模块加载到规范中的方式:

loader = importlib.machinery.SourceFileLoader(filename, dirpath+"/"+filename)
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)

这种方法导致模块的 inspect.getmembers 到 return 有效 类。