如何组织我已经工作的插件系统的文件结构?

mac*_*mac 5 python plugins introspection software-design file-management

我正在研究一个项目,其主要设计指导原则是可扩展性.

我通过定义一个元类来实现一个插件系统,该元类使用类方法注册任何被加载的插件的类名(每种类型的插件都继承自核心代码中定义的特定类,因为有不同类型的插件应用程序).基本上这意味着开发人员必须将他的类定义为

class PieChart(ChartPluginAncestor):
    # Duck typing:
    # Implement compulsory methods for Plugins 
    # extending Chart functionality
Run Code Online (Sandbox Code Playgroud)

并且主程序将知道他的存在,因为PieChart将包含在可用的已注册插件列表中ChartPluginAncestor.plugins.

作为类方法的安装方法,所有插件在其类代码加载到内存时都会被注册(因此即使在实例化该类的对象之前)也是如此.

该系统对我来说工作得很好(虽然我总是对如何改进架构的建议持开放态度!)但我现在想知道什么是管理插件文件的最佳方式(即包含插件的文件的位置和方式)应该存储).

到目前为止,我正在使用 - 用于开发目的 - 我称之为"插件"的包.我将所有包含插件类的*.py文件放在包目录中,我只需import plugins在main.py文件中发出,以便正确安装所有插件.

编辑:杰夫在评论中指出,import plugins包的各个模块中包含的类将不会随时可用(我没有意识到这一点 - 因为我是 - 为了调试目的 - 分别导入每个类from plugins.myAI import AI).

但是,在我开发和测试代码时,这个系统才有用,如:

  • 插件可能带有自己的单元测试,我不想在内存中加载它们.
  • 所有插件目前都已加载到内存中,但实际上有些插件是同一功能的替代版本,所以你真的需要知道你可以在两者之间切换,但是你想要加载到你选择的那个内存中从配置窗格中.
  • 在某些时候,我希望有一个双重位置来安装插件:系统范围的位置(例如在某处/usr/local/bin/)和用户特定的位置(例如在某处/home/<user>/.myprogram/).

所以我的问题确实 - 或许 - 三个:

  1. 插件容器:我的目标最明智的选择是什么?单个文件?包?一个简单的.py文件目录?)
  2. 识别插件的存在而不必加载(导入)它们:使用Python内省的智能方法是什么?
  3. 将插件放在两个不同的位置:是否有标准的方法/最佳实践(至少在gnu/linux下)?

dai*_*gio 3

这个问题很难解决,因为需求很复杂。无论如何,我会尝试一些建议。

关于

将插件放置在两个不同的位置:是否有标准方法/最佳实践(至少在 gnu/linux 下)来做到这一点?

一个好的方法是 virtualenv。Virtualenv 是一个用于构建“隔离”Python 安装的 Python 模块。这是让单独的项目协同工作的更好方法。您将获得一个全新的站点包,您可以将插件与相关项目模块放在其中。

尝试一下: http: //pypi.python.org/pypi/virtualenv

插件容器:对于我的目标来说最明智的选择是什么?单个文件?包裹?.py 文件的简单目录?)

一个好的方法是使用 python 包,它可以在导入时进行“自注册”:只需在包目录中定义适当的init .py

一个示例可以是http://www.qgis.org/wiki/Writing_Python_Plugins 以及此处描述的 API http://twistedmatrix.com/documents/current/core/howto/plugin.html

另请参阅http://pypi.python.org/pypi/giblets/0.2.1

Giblets 是一个基于 Trac 组件架构的简单插件系统。简而言之,giblets 允许您声明接口并发现实现它们的组件,而无需耦合。

Giblets 还包括基于文件路径或入口点的插件发现以及管理应用程序中启用或禁用哪些组件的灵活方法。