私はPythonには比較的新しい(小さなWebサーバーやローカルネットワークチャットのような1時間のスクリプトをすでに行っています)、プラグインマネージャーをプログラムしたいと思っています。 私の考えは、以下のような特徴を持っているプラグインのインタフェースは、そこにあることを、次のとおりです。Pythonのプラグインマネージャー
getDependencies -> all dependencies of the plugin to other plugins
getFunctions -> all functions that this plugin introduces
initialize -> a function that is called when loading the plugin
(私は、プラグインが初期化される順序を決定するために、依存関係にトポロジカル整列アルゴリズムを持つことが想像できます。 )
私はマルチスレッドを実装したいと思います。つまり、各プラグインは独自のスレッドで実行され、順次実行される関数呼び出しの作業キューがあります。プラグインが別のプラグインの機能を呼び出すと、プラグインはマネージャを呼び出します。マネージャは、他のプラグインのキューに関数呼び出しを挿入します。
さらに、マネージャは、プラグインが独自のイベントを登録して他のイベントのリスナーになるようなイベントシステムを提供する必要があります。
また、マネージャ/アプリケーションをシャットダウンすることなく、コードが変更された場合やスレッドがクラッシュした場合に、プラグインをリロードすることができます。私はすでにこれと一緒にHow do I unload (reload) a Python module?を読んでいます。
もう一度明確にする:マネージャは、相互に共通の通信インターフェイスを持つプラグインをサポートする以外の機能は提供しないでください(プラグインを必要とせずにマルチスレッドで実行する機能)。これを認識して)、更新された/クラッシュしたプラグインを復元します。
私の質問は次のとおりです:これはpythonでこれを行うことは可能ですか?そしてもしそうなら、この大まかなスケッチにデザインミスがありますか?私はこれに関する良いアドバイスを感謝します。
その他の「文学」:最も基本的なレベルで Implementing a Plugin System in Python
具体的な詳細を教えてください。実際にやるべきプラグインは何ですか? Pythonのネイティブパッケージシステムにフックすることで、プラグインシステムを実装しました。それはスレッドや何かではなく、動作します。 :) –
@bebrawWellこれまでは非常に普遍的な設計で、私はそれを後のプロジェクトで再利用するためにそのまま残しておきたいと思います。 – Nobody
私はちょうどこれによって来た、http://stackoverflow.com/questions/932069/building-a-minimal-plugin-architecture-in-python。そこにはいくつかの出発点があります。 –