1

私はこれを読んでいます:
http://lkubuntu.wordpress.com/2012/10/02/writing-a-python-plugin-api/
私はMinecraftのヘルプシステムのようなことをしようとしています。
メインモジュールがあり、ヘルプコマンドは次のとおりです。


テスト
1 テスト 2を助ける

そして、プラグインをロードした後、同じセットに加えて、プラグインで利用可能なセットが得られます。
また、コマンドを処理するとき、内部プログラムからのコマンドとプラグインからのコマンドを区別するにはどうすればよいですか?!
これまでのところ、私はこれを思いつきました:

import imp
import os

PluginFolder = "./plugins"
MainModule = "__init__"

def getPlugins():
    plugins = []
    possibleplugins = os.listdir(PluginFolder)
    for i in possibleplugins:
        location = os.path.join(PluginFolder,i)
        if not os.path.isdir(location) or not MainModule + ".py" in os.listdir(location):
            continue
        info = imp.find_module(MainModule, [location])
        plugins.append({"name":i, "info": info})
    return plugins

def loadPlugin(plugin):
    return imp.load_module(MainModule, *plugin["info"])

disponiveis = []
for i in getPlugins():
    print("Loading plugin "+ i["name"])
    plugin = loadPlugin(i)
    plugin.run()
    disponiveis.append(i["name"])

while 1:
    foo = raw_input(":")
    if foo == 'quit':
        break;
    elif foo in disponiveis:
        print "ok"
    else:
        continue

元の例からそれほど多くはありません:|
私の大きな問題は、すべてのプラグインをロードするサイクルです。現在、 hellotesting
の 2 つのプラグインがあります。このようなものを得るにはどうすればよいですか:

send_command(plugin_name, action)

また、if/elif はちょっと不自由です... 利用可能なコマンドはプラグインから取得する必要があります。多分dict
を使用していますか?!?! そして、プラグインをロードすると、追加のコマンドがその辞書に追加されます?!?!

4

2 に答える 2

3

あなたが引用したブログ エントリの最後の行には、「もちろん、このプラグイン API は非常にシンプルであり、プログラムのニーズに合わせて簡単に拡張できます (また拡張する必要があります)」と書かれています。

サンプル コードで定義されている唯一の「api」は、plugin.run()何も返さないメソッドです。したがって、少なくともあなたの質問からは、ロードされたプラグインが持つ利用可能な「コマンド」を説明するものが必要なようです。これを行う 1 つの方法は、すべてのプラグインが提供しなければならない別のメソッドを定義することですavailable_commands()。これは、キーがすべてのコマンド名であり、値がそれらを実行する対応する関数であるコマンドの辞書を返します。

ただし、コマンド引数情報をクライアント アプリケーションにも返す何らかのメカニズムで拡張する必要がある場合があります。これがどのように行われるかは、自分で何かを発明するか、他の人がそれをどのように行ったかを知るための想像力によってのみ制限されます。おそらく、StackOverflow でより具体的な質問をすることによって可能です。

于 2012-12-16T09:22:36.323 に答える