动态导入需要其他模块的Python模块

时间:2019-12-03 00:29:59

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

我正在处理一个脚本,该脚本将从目录(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

我尝试在BaseClass中定义main.py并事先将其导入,并且尝试将其导入插件文件中,但无法弄清楚如何导入

导入依赖其他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")

1 个答案:

答案 0 :(得分:0)

似乎我在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.py放在main.py的主文件夹中解决了子类化问题。