1

私のプログラムは2つの部分に分かれています。ユーザーインターフェイスやその他の「メインプログラム」を処理するエンジンと、特定の入力を処理するメソッドを提供するプラグインのセットです。

各プラグインは独自のモジュールで記述されており、プラグインとの間でデータを送受信できるようにする関数を提供します。

この関数の名前はすべてのプラグインで同じなので、必要なのはどれを呼び出すかを決定することだけです。そうすれば、プラグインが残りを処理します。

すべてのプラグインをサブフォルダーに配置し、__ init__.py各プラグインをインポートするを作成してから、フォルダーをインポートします(パッケージと呼ばれると思いますか?)

とにかく現在、私は何をインポートするかを明示的に指示しています(これは基本的に「これをインポートする」、「それをインポートする」です)。プラグインであるそのフォルダー内のすべてをインポートして、initファイルを編集せずにプラグインを追加できるようにする方法はありますか?

4

2 に答える 2

2

これを行うために使用するコードは次のとおりです。

def _loadPackagePlugins(package):
  "Load plugins from a specified package."
  ppath = package.__path__
  pname = package.__name__ + "."
  for importer, modname, ispkg in pkgutil.iter_modules(ppath, pname):
    module = __import__(modname, fromlist = "dummy")

Jakob の回答との主な違いは、os.listdir の代わりに pkgutil.iter_modules を使用することです。以前は os.listdir を使用していましたが、この方法に変更しましたが、理由は覚えていません。py2exe と py2app でアプリをパッケージ化したときに os.listdir が失敗した可能性があります。

于 2011-06-29T22:13:54.843 に答える
1

プラグインと呼ばれる辞書をいつでも持つことができ__import__、モジュールをインポートしてそのように保存するために使用できます。

例えば

plugins = {}
for plugin in os.listdir('plugins'):
    plugin = plugin.split()[0]
    plugins[plugin] = __import__(plugin)

これは、すべてのプラグインが単一のファイルであると想定しています。個人的には、プラグインを示すパッケージ__run__.pyのように、各フォルダーでファイルを検索するものを__init__.py使用します。そのコードは、次のようなものになります

for root, dirs, files in os.walk('.'):
    for dir in dirs:
        if "__run__.py" in os.listdir(os.path.join(root, dir)):
            plugins[dir] = __import__(dir)

テストせずに書かれたコード。YMMV

于 2011-06-29T22:03:04.533 に答える