从磁盘上的python源代码文件动态加载类的最佳方法是什么? (意味着我不能仅是import className
)
到目前为止,我已经能够使用以下命令将源代码加载到内存中并使用它制作一个python模块对象:
spec = importlib.util.spec_from_file_location(modname, sourcepath)
module = importlib.util.module_from_spec(spec)
到目前为止,该代码有效。接下来,我要做的就是使用inspect.getmembers()函数从加载的模块中仅提取类,但这就是问题所在,该函数返回一个空列表。
classes = inspect.getmembers(module, inspect.isclass)
此代码实际上在Python 2中有效,唯一的区别是我使用imp
库和imp.load_source(modname, modpath))
函数将源文件加载到了模块形式中。
我需要此代码用于inspect.getmembers
调用,以返回特定模块的类列表,或者以另一种方式实现此动态类查找。
之所以这样做,是因为我正在编写一个小程序,以python类的形式加载插件,然后使用预定义的函数调用进行交互。
经过很多混乱之后,我发现解决方案非常简单。
我只需要更改将模块加载到规范中的方式,就像这样:
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
从模块返回有效的类。