Python中作为插件的包

Python中作为插件的包,python,plugins,packaging,extending,Python,Plugins,Packaging,Extending,通过可选包扩展python包的最佳方式是什么?我们的想法是,您可以这样: pip install mypackage 或者: pip install mypackage-option1 然后,您的应用程序将执行以下操作: from mypackage import somefunction 但是somefunction知道如果安装了mypackage-option1 我见过一些通过插件系统实现这一点的方法,但我需要满足一些要求: Python 2.6+和3.2+ 零配置 mypackag

通过可选包扩展python包的最佳方式是什么?我们的想法是,您可以这样:

pip install mypackage
或者:

pip install mypackage-option1
然后,您的应用程序将执行以下操作:

from mypackage import somefunction
但是
somefunction
知道如果安装了
mypackage-option1

我见过一些通过插件系统实现这一点的方法,但我需要满足一些要求:

  • Python 2.6+和3.2+
  • 零配置
  • mypackage
    不应明确使用
    mypackage-option1
    。(即,如果将来我有
    mypackage-option2
    ,它应该可以在不改变
    mypackage
    的情况下工作)
  • 使用
    mypackage
    的应用程序不需要导入
    mypackage-option1
  • 没有配置文件或列表存储在用户目录或其他任何位置

如果你的插件包的名称总是以
mypackage-
开头(如果没有配置要求,你可能需要这样的约定),你可以:

import pkgutil
plugin_names = [
    name for (loader, name, ispkg) in pkgutil.iter_modules()
    if name.startswith('mypackage-')]

这将得到作为字符串的包名。然后您可以使用
\uuuu import\uuuu()
动态导入模块。

为什么不使用mypackage-option1 import somefunction中的