Eph*_*eal 5 python pycharm python-3.x python-importlib
我已经制作了一个可以加载插件的Python应用程序。这些插件是根据名称和路径加载的。
我目前正在使用
pluginModule = imp.load_source(pluginModuleName, pluginModulePath)
Run Code Online (Sandbox Code Playgroud)
然后以这种方式在模块中获取类实例
# Load the module class and initialize it.
if hasattr(pluginModule, pluginClassName):
try:
pluginClassInst = getattr(pluginModule, pluginClassName)()
except Exception as e:
errorMsg = ('In plugin module [{}], {}'.format(os.path.basename(pluginModulePath), e))
exceptionTracePrint(self._log)
self._log.error(errorMsg)
continue
Run Code Online (Sandbox Code Playgroud)
由于不建议使用imp lib,因此我想使用importlib。而获得类实例的唯一类似方法是使用
pluginModule = importlib.machinery.SourceFileLoader(pluginModuleName, pluginModulePath).load_module()
Run Code Online (Sandbox Code Playgroud)
这里很奇怪(我正在使用pyCharm作为IDE)。当我在调试模式下运行代码时,上面的命令可以正常工作,并且可以获取类实例。但是运行代码通常会给我以下错误。
pluginModule = importlib.machinery.SourceFileLoader(pluginModuleName, pluginModulePath).load_module()
AttributeError: 'module' object has no attribute 'machinery'
Run Code Online (Sandbox Code Playgroud)
为什么运行和调试之间会有区别。有没有一种做我想要的替代方法。
我也尝试过
pluginModuleTmp = importlib.util.spec_from_file_location(pluginModuleName, pluginModulePath)
Run Code Online (Sandbox Code Playgroud)
这也给了我正确的数据,但是我无法以这种方式加载模块,或者至少我不知道如何
问候安德斯
找到了解决方案。显然,在调试模式下,我背后导入了更多模块。我通过添加导入来修复它。
import importlib.machinery
Run Code Online (Sandbox Code Playgroud)
问候安德斯
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |