2017-06-19 66 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' 

我還是相當新的蟒蛇,我知道我可能不會設置正確地啓動我的模塊,但我不知道爲什麼。

回答

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