2011-06-03 60 views
8

我正在編寫一個應用程序(Minecraft的服務器包裝),我希望通過插件進行擴展。我有一個可行的系統,但我認爲從長遠來看,它可以使用改進。在Python中實現插件系統

我現在擁有它的方式是,應用程序在服務器類中調用一個「get_plugins」方法,首先導入一個名爲pluginutils.py的文件(pluginutils.py定義了一個所有插件子類的BasePlugin類),然後遍歷目錄cmd中的每個.py文件,導入它並檢查它是否是BasePlugin的子類。如果是,它會將它的一個實例存儲在字典中,其中的關鍵是插件中定義的類變量。每當應用程序收到來自服務器的命令時,它都會檢查它是否是字典中的一個鍵,如果是,則運行存儲在字典中的實例的start方法,並將其從命令中獲取的必要參數傳遞給它。

雖然這樣做,我覺得這是一個馬虎的做法。有沒有更好的技術來實現類似這樣的系統?我想自己寫這個(我不想使用任何類似zope.interface的東西),因爲這是一種學習體驗。謝謝。

+0

我好奇; **如何檢查插件是否具有子類BasePlugin類? – tMC 2011-06-03 23:13:20

+0

@tMC您可以使用Class .__子類__(),它返回類(BasePlugin)的子類列表。我檢查他們對這個名單。 – 2011-06-03 23:15:46

+0

謝謝,我不知道;這將是非常有用的! – tMC 2011-06-03 23:18:11

回答

2

在不同的平臺和語言中編寫了很多不同的插件體系結構之後,我會說你已經掌握了大部分插件系統的寫法。

基本上它歸結爲什麼,你的主機和你的插件需要有一些共同的合同工作;換句話說,您的主機需要充分了解您的插件,以便它可以傳遞或共享插件所需的任何常用資源,並且插件需要足夠了解主機與這些資源進行交互。

像你所做的那樣,使用基類和派生類來實現這是一種非常常見的方法。

+0

我所做的研究基本上讓我知道你在說什麼。我只是覺得實施,因爲我有點sl。。 – 2011-06-04 19:53:53

0

我會建議使用setuptools的,因爲插件最終被鏈接到sys.path列表的管理:

http://peak.telecommunity.com/DevCenter/PkgResources

從長遠來看,分配/包裝基礎的解決方案就像setuptools的將永遠是一個堅實的選擇,因爲:

  • 你必須加載插件沒有衝突或缺少requi
  • 即使加載插件依賴於其他動態依賴關係,並且
  • 您必須在安裝和刪除程序包時更新可用插件的列表。