Pythonプラグイン

今日は、インクルードを使用してPythonでプラグインアーキテクチャを構築する方法を説明します。




私たちのアプリケーションはコマンドを受け取り、プラグインがそれを処理することを期待してプラグインに配布します

トリッキーな計画





main.py


例の「外部」部分のコードのみが含まれており、コメントする必要がないことを望みます。

Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  1. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  2. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  3. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  4. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  5. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  6. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  7. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  8. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])
  9. Copy Source | Copy HTML import plugin plugin.LoadPlugins() s = '' while (s != 'exit' ): print '>' , s = raw_input () a = s.split( ' ' ) for p in plugin.Plugins: p.OnCommand(a[ 0 ], a[ 1 :])


plugin.pyで取り出すプラグインに関連するすべてのコード

plugin.py


Copy Source | Copy HTML
  1. 輸入 OS
  2. インポートシステム
  3. #ダウンロードしたプラグインのインスタンス
  4. プラグイン= []
  5. #プラグインの基本クラス
  6. クラス プラグイン (オブジェクト):
  7. 名前= 'undefined'
  8. #フィードバック方法
  9. def OnLoad (自己):
  10. 合格する
  11. def OnCommand (self、cmd、args):
  12. 合格する
  13. def LoadPlugins ():
  14. ss = os .listdir( 'plugins'#/ plugins内のプラグインのリストを取得
  15. sys .path.insert( 0'plugins'#プラグインフォルダーを$ PATHに追加して、__ import__がそれらをロードできるようにする
  16. ssの場合:
  17. 'Found plugin'を 印刷し ます 、s
  18. __import__os .path.splitext(s)[ 0 ]、None、None、[ '' ]) #プラグインソースをインポート
  19. プラグインのプラグイン .__サブクラス__(): #プラグインはオブジェクトから派生するため、 __ subclasses__ を使用して、このクラスから生成されたすべてのプラグインを検索します
  20. p = plugin() #インスタンスを作成する
  21. Plugins.append(p)
  22. p。 OnLoad () #このプラグインのロードイベントを呼び出す
  23. 帰る


plugins / foo.py-プラグインの例


Copy Source | Copy HTML
  1. プラグインインポートプラグインから
  2. class HelloPlugin (Plugin): #親クラスからプラグインを生成します
  3. 名前= 'HelloPlugin v 1.0 Extreme Edition'
  4. #必要なメソッドを置き換える
  5. def OnLoad (自己):
  6. 「HelloPlugin 1.0 Extreme VIP Edition Loaded!」の 印刷
  7. def OnCommand (self、cmd、args):
  8. if (cmd == 'hello' and len (args)> 0 ):
  9. 'It \' s ' 、引数[ 0 ]、 '!\ nJeez、男、はじめまして!
  10. 真を返す
  11. その他
  12. 偽を返す


これで例を実行できます。
$ python main.py
プラグインfoo.pyが見つかりました
HelloPlugin 1.0 Extreme VIP Editionがロードされました!
> hello%username%
%username%です!
うわぁ、はじめまして!
>


plugins / shell.py-より複雑なプラグイン


コマンドをシェルにブロードキャストして出力を返すプラグインを作成しましょう。

Copy Source | Copy HTML
  1. プラグインインポートプラグインから
  2. インポートコマンド
  3. クラス ShellPlugin (プラグイン):
  4. 名前= 「シェルプラグイン」
  5. def OnLoad (自己):
  6. 「シェルプラグインがロードされました。」
  7. def OnCommand (self、cmd、args):
  8. if (cmd == 'run' ):
  9. 印刷 コマンド .getoutput( "" .join(args))
  10. 真を返す
  11. その他
  12. 偽を返す


$ python main.py
プラグインshell.pyが見つかりました
プラグインfoo.pyが見つかりました
シェルプラグインがロードされました。
HelloPlugin 1.0 Extreme VIP Editionがロードされました!
> uname -rを実行します
2.6.31-14-generic
>終了


以上です!
ソースコードをダウンロードする

Source: https://habr.com/ru/post/J79513/


All Articles