Python 插件设计问题

Python 插件设计问题,python,plugin-architecture,Python,Plugin Architecture,我的程序分为两部分:处理用户界面和其他“主程序”内容的引擎,以及提供处理特定输入方法的一组插件 每个插件都写在自己的模块中,并提供了一个函数,允许我向插件发送和检索数据 这个函数的名称在所有插件中都是相同的,所以我只需要确定调用哪一个,然后插件将处理其余的 我把所有的插件都放在一个子文件夹中,编写了一个导入每个插件的\uuuuuu_uuuu.py,然后导入这个文件夹(我想它被称为包?) 无论如何,目前我明确告诉它要导入什么(基本上是“导入这个”、“导入那个”)。有没有一种方法可以让我编写它,这样

我的程序分为两部分:处理用户界面和其他“主程序”内容的引擎,以及提供处理特定输入方法的一组插件

每个插件都写在自己的模块中,并提供了一个函数,允许我向插件发送和检索数据

这个函数的名称在所有插件中都是相同的,所以我只需要确定调用哪一个,然后插件将处理其余的

我把所有的插件都放在一个子文件夹中,编写了一个导入每个插件的
\uuuuuu_uuuu.py
,然后导入这个文件夹(我想它被称为包?)


无论如何,目前我明确告诉它要导入什么(基本上是“导入这个”、“导入那个”)。有没有一种方法可以让我编写它,这样它就可以导入该文件夹中作为插件的所有内容,这样我就可以添加额外的插件,而不必编辑init文件?

您可以始终拥有一个名为plugins的dict,使用
\uu import\uu
导入模块并以这种方式存储它们

e、 g

这是假设每个插件都是一个文件。就我个人而言,我会在每个文件夹中查找一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

for root, dirs, files in os.walk('.'):
    for dir in dirs:
        if "__run__.py" in os.listdir(os.path.join(root, dir)):
            plugins[dir] = __import__(dir)

未经测试而编写的代码。YMMV

以下是我用来执行此操作的代码:

def _loadPackagePlugins(package):
  "Load plugins from a specified package."
  ppath = package.__path__
  pname = package.__name__ + "."
  for importer, modname, ispkg in pkgutil.iter_modules(ppath, pname):
    module = __import__(modname, fromlist = "dummy")

与Jakob的答案的主要区别在于,它使用pkgutil.iter_模块而不是os.listdir。我以前使用os.listdir并改为这样做,但我不记得为什么了。当我用py2exe和py2app打包我的应用程序时,os.listdir可能失败了。

比使用单个文件夹或硬编码多个文件夹名称灵活得多。好主意。奇怪,这是一个奇怪的模块。我仍然喜欢这个答案。
def _loadPackagePlugins(package):
  "Load plugins from a specified package."
  ppath = package.__path__
  pname = package.__name__ + "."
  for importer, modname, ispkg in pkgutil.iter_modules(ppath, pname):
    module = __import__(modname, fromlist = "dummy")