1

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

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

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

我已将所有插件放在一个子文件夹中,编写了一个__ init__.py导入每个插件的文件,然后导入该文件夹(我认为它称为包?)

无论如何,目前我明确告诉它要导入什么(基本上是“导入这个”,“导入那个”)。有没有办法让我编写它,以便它将导入该文件夹中的所有插件,以便我可以添加其他插件而无需编辑初始化文件?

4

2 回答 2

2

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

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_modules 而不是 os.listdir。我曾经使用 os.listdir 并改为这样做,但我不记得为什么。当我用 py2exe 和 py2app 打包我的应用程序时,可能是 os.listdir 失败了。

于 2011-06-29T22:13:54.843 回答
1

您总是可以有一个名为 plugins 的字典,用于__import__导入模块并以这种方式存储它们。

例如

plugins = {}
for plugin in os.listdir('plugins'):
    plugin = plugin.split()[0]
    plugins[plugin] = __import__(plugin)

这是假设每个插件都是一个文件。就我个人而言,我会使用在每个文件夹中查找文件的东西__run__.py,比如__init__.py在包中它表示插件,该代码看起来更像这样

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

于 2011-06-29T22:03:04.533 回答