从动态加载的模块中实例化 类
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 有效 类。
从磁盘上的 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 有效 类。