2017-06-19 10 views
0

私はpluginsフォルダを持ち、python Project.py --plugin TestPlugin.testで実行されているプロジェクトを持っています。コマンドライン引数に基づいてモジュールを動的にロードする方法はありますか?

plugins/ 
    TestPlugin/ 
     test.py 
Project.py 
PluginLoader.py 

私はトラブルプラグインローダーを持つモジュールとしてtest.pyのロードを抱えている:

ディレクトリ構造は次のようになります。 PluginLoader.pyで

これは私の関数である:

def loadPlugin(pluginName): #would be "TestPlugin.test" this is passed in from Project.py which gets the value from parseargs. 
    plugin = pluginName.rsplit(".", 1) 


    if len(plugin) == 2: 
     module = import_module(plugin[1], package='.'.join(["plugins", plugin[0]]) 
     print(getattr(module, "test")) 
     return module 

私はこのエラーを取得しておいてください。

python Project.py --plugin TestPlugin.test 
Traceback (most recent call last): 
    File "Project.py", line 107, in <module> 
    plugin = PluginLoader.loadPlugin(comArgs.plugin) 
    File "PluginLoader.py", line 15, in loadPlugin 
    module = import_module(plugin[ 1 ], package = ".".join(["plugins", plugin[ 0 ] ])) 
    File "/Users/********/anaconda/lib/python3.5/importlib/__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked 
ImportError: No module named 'test' 

私はまだのpythonにかなり新しいだと私は、私はおそらく設定していないよ知っています私のモジュールを正しくアップすることができますが、私はなぜそうは分かりません。

答えて

1

モジュールがこのように認識されるためには、* .pyファイルはsys.pathのパスからアクセス可能である必要があります。または、__init__.pyというファイルがあるディレクトリにある必要があります。また、相対的なインポートを行っていないので、パッケージを定義する必要はありません(ただし、プラグイン名を '相対'として宣言した場合は、pluginsを完全に使用できます。その宣言された名前の)。

だから、としてあなたのディレクトリ構造を作る:

plugins/ 
    TestPlugin/ 
     __init__.py 
     test.py 
    __init__.py 
Project.py 
PluginLoader.py

そして、あなたのPluginLoader.pyは持っています

import importlib 

def load_plugin(plugin): 
    mod = importlib.import_module("." + plugin, "plugins") 
    print(getattr(mod, "test")) 
    return mod 

そして、すべてがうまくなければなりません。

+0

それで、私のPluginLoader.pyにプラグインフォルダをインポートする必要があるように見えます。正しい方向に私を指してくれてありがとう。 – TripWired

関連する問題