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

问题描述 投票:0回答:1

从磁盘上的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类的形式加载插件,然后使用预定义的函数调用进行交互。

python-3.5
1个回答
0
投票

经过很多混乱之后,我发现解决方案非常简单。

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

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从模块返回有效的类。

© www.soinside.com 2019 - 2024. All rights reserved.