2011-06-29 14 views
1

私のプログラムは、ユーザーインターフェイスとその他の「メインプログラム」のものを扱うエンジンと、特定の入力を処理するためのメソッドを提供するプラグインの2つの部分に分かれています。プラグインの設計に関する質問

各プラグインは独自のモジュールで書かれており、プラグインとの間でデータの送受信を行う機能を提供します。

この関数の名前はすべてのプラグインで同じです。したがって、どちらを呼び出すかを決定してから、プラグインが残りの部分を処理するだけです。私は、サブフォルダ内のすべてのプラグインを配置した

は、各プラグインをインポート__ init__.pyを書いて、その後、私は現在、私は明示的に言うとにかくフォルダ(私はそれがパッケージと呼ばれると思う?)

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

答えて

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") 

ヤコブの答えからの主な違いは、それが代わりにos.listdirのpkgutil.iter_modulesを使用していることです。私はos.listdirを使用していましたが、これをやり直す方法に変更しましたが、なぜか覚えていません。おそらく、私がpy2exeとpy2appでアプリケーションをパッケージ化したときにos.listdirが失敗した可能性があります。

+0

これは便利です。ありがとう – MxyL

+0

奇妙な、と私はまだ答えが奇妙なモジュールthats。 –

1

いつでもプラグインと呼ばれるディクテーションを使用できます。__import__を使用して、モジュールをインポートし、そのように格納します。

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

これは、すべてのプラグインが1つのファイルであることを前提としています。個人的に私は、そのコードがより多くのテストを行わずに書かれたこの

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) 

コードのようなもののようになり、それはプラグインを示すことになるパッケージに__init__.pyよう__run__.pyファイルの各フォルダに見える何か、となるだろう。 YMMVここ

+0

複数のフォルダ名を1つのフォルダまたはハードコードするよりもはるかに柔軟性があります。良いアイデア。 – MxyL

関連する問題