【问题标题】:Dynamically importing Python modules that require other modules动态导入需要其他模块的 Python 模块
【发布时间】:2019-12-03 00:29:59
【问题描述】:

我正在编写一个脚本,该脚本将从目录 (plugins) 加载插件,这些插件文件应该包含一个从基类 (BaseClass) 子类化的类。我不知道插件文件或子类的名称,但我打算找到所有带有BaseClass.__subclasses__() 的插件类。

在我的main.py 中,我正在遍历plugins 文件夹并像这样加载每个模块:

pluginlist = []
for pluginfile in pluginfiles :
        pluginlist.append(importlib.import_module(pluginfile))

但是,当我以这种方式导入它们时,它们找不到BaseClass

    class CustomPlugin(BaseClass) :
NameError: name 'BaseClass' is not defined

我尝试在main.py 中定义BaseClass 并预先导入它,我尝试在插件文件中导入它,但无法弄清楚如何导入它。

导入依赖于其他 python 模块的动态 python 模块的最佳方法是什么?

编辑:

main.py:

import importlib
import os

plugindir="plugins"
pluginfiles = os.listdir(plugindir)
for pluginfile in pluginfiles :
    testfile = importlib.import_module("plugins."+pluginfile)
print(dir())

plugins 文件夹中:

baseclass.py:

class BaseClass() :
    def __init__(self) :
        print("I am a base class")

customplugin.py:

from .baseclass import BaseClass

class CustomPlugin(BaseClass) :
    def __init__(self) :
        print("I am a custom subclass of BaseClass")

【问题讨论】:

  • 您是否从这些插件中正确导入了 BaseClass?它们不会共享循环正在运行的全局模块状态,每个模块都有一个孤立的范围,python 称之为“全局”
  • 我不确定如何正确导入 BaseClass,因为理想情况下它应该位于 plugins 目录之上。当我在 plugins 的文件中定义 BaseClass 并将其导入时,我收到有关 plugins.customplugin is not a package 的错误。
  • 这些插件的文件夹中有__init__.py 文件吗?这就是定义 python 包的原因
  • plugins文件夹中有一个__init__.py,是的。
  • 你能分享一个完整的最小插件吗?更具体地说,在其中进行导入的方式和位置

标签: python-3.x plugins python-import subclassing


【解决方案1】:

看起来我在 importlib.import_module() 语句中包含了“.py”,更改了这个:

for pluginfile in pluginfiles :
    testfile = importlib.import_module("plugins."+pluginfile)

到这里:

for pluginfile in pluginfiles :
    testfile = importlib.import_module("plugins."+pluginfile.split('.')[0])

解决了导入问题。将baseclass.pymain.py 放在主文件夹中解决了子类化问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2011-04-17
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多