我正在做一个项目,其主要设计指导原则是可扩展性。在
我通过定义一个元类来实现一个插件系统,该元类用类方法注册加载的任何插件的类名(每种类型的插件继承自核心代码中定义的特定类,因为应用程序中有不同类型的插件)。基本上这意味着开发人员必须将他的类定义为
class PieChart(ChartPluginAncestor):
# Duck typing:
# Implement compulsory methods for Plugins
# extending Chart functionality
主程序将知道他的存在,因为PieChart
将包含在ChartPluginAncestor.plugins
上的已注册插件列表中。在
由于挂载方法是一个类方法,所有的插件都会在其类代码加载到内存中时注册(因此即使在实例化该类的对象之前也是如此)。在
系统运行良好™ 对我来说(尽管我总是乐于接受关于如何改进体系结构的建议!)但是我现在想知道什么是管理插件文件的最佳方式(即包含插件的文件应该存储在哪里和如何存储)。在
到目前为止,为了开发目的,我使用了一个我称之为“插件”的包。我把所有包含插件类的*.py文件放在包目录中,然后在主.py文件,以便所有插件都能正确安装。在
编辑:Jeff在评论中指出import plugins
包的各个模块中包含的类将不容易获得(我没有意识到这一点,因为我是为了调试目的,使用from plugins.myAI import AI
分别导入每个类)。在
但是,这个系统只有在我开发和测试代码时才是好的,因为:
/usr/local/bin/
)和一个特定于用户的位置(例如/home/<user>/.myprogram/
下的某个位置)。在所以我的问题真的-也许-三个:
我也有一个插件系统,有三种类型的插件,尽管我并不声称做得很好。您可以看到一些细节here。在
对于内部插件,我有一个包(例如,
MethodPlugins
),在这个包中是每个插件的一个模块(例如,MethodPlugins.IRV
)。下面是我如何加载插件:加载包(
import MethodPlugins
)使用
pkgutil.iter_modules
加载那里的所有模块(例如,MethodPlugins.IRV
)所有插件都来自一个公共基类,所以我可以使用
__subclassess__
来标识它们。我相信这可以让你在不加载插件的情况下识别插件,尽管我不这么做,因为我只是把它们全部加载。在
对于外部插件,我有一个用户可以放置它们的指定目录,我使用
os.listdir
导入它们。用户需要使用正确的基类,这样我才能找到它们。在我也有兴趣改进这一点,但它对我来说也足够好了。:)
这个问题很难解决,因为需求很复杂。 不管怎样,我会试着提出一些建议。在
关于
一个好的方法是virtualenv。Virtualenv是一个python模块,用于构建“独立的”python安装。这是让不同项目协同工作的更好方法。 你得到了一个全新的网站包,你可以把你的插件与相关的项目模块。在
试试看:http://pypi.python.org/pypi/virtualenv
一个好的方法是一个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
相关问题 更多 >
编程相关推荐