我正在研究一個主要設計指導原則是可擴展性的項目。一類方法 - -如何組織已經工作的插件系統的文件結構?
我通過定義寄存器元類實現的插件系統被加載任何插件的類名(每個類型的插件從核心代碼中定義的特定類繼承,因爲有是應用程序中不同類型的插件)。基本上,這意味着開發者必須定義自己班級的
class PieChart(ChartPluginAncestor):
# Duck typing:
# Implement compulsory methods for Plugins
# extending Chart functionality
和主程序就知道他的存在,因爲PieChart
將被列入註冊插件可在ChartPluginAncestor.plugins
列表。
作爲安裝方法類方法,當他們的類別代碼被加載到內存中的所有插件獲得註冊(即類的對象實例化所以即使之前)。
該系統的工作足夠™爲我好(雖然我總是願意就如何提高建築!建議),但我現在想知道什麼是管理插件文件的最佳方式(即哪裏以及如何保存包含插件的文件)。
到目前爲止,我正在使用 - 用於開發目的 - 我稱之爲「插件」的軟件包。我將包含插件類的所有* .py文件放在軟件包目錄中,我只需在main.py文件中發佈import plugins
,以便所有插件能夠正確掛載。
編輯:傑夫在評論中指出,import plugins
包含在套餐的各個模塊課程將不是可用的(我沒有意識到這一點,因爲我是 - 用於調試目的 - 分別導入每個類與from plugins.myAI import AI
)。
但是這個系統是唯一的好,而我的開發和測試代碼,如:
- 插件可能會帶着自己的單元測試,我不希望加載那些在內存中。
- 所有插件目前都被加載到內存中,但確實有一些插件是相同功能的替代版本,所以您只需要知道您可以在兩者之間切換,但是您只需將它們加載到內存中即可你從配置窗格中選擇的一個。
- 在某些時候,我希望有一個安裝插件的雙重位置:系統範圍的位置(例如
/usr/local/bin/
以下的某處)和用戶特定的位置(例如/home/<user>/.myprogram/
以下的某處)。
所以我的問題是真的 - 也許 - 三:
- 插件容器:什麼是最明智的選擇。我的目標是什麼?單個文件?包?一個簡單的.py文件目錄?)
- 意識到插件的存在,而不一定要加載(導入)它們:什麼是使用Python自省的聰明方法?
- 將插件放置在兩個不同的位置:是否有標準方法/最佳實踐(至少在gnu/linux下)來做到這一點?
我會認爲'import plugins'只會加載包而不是包中的模塊。 – 2010-07-29 13:36:21
這是我正在尋找的提示! :) – mac 2010-08-02 12:51:51