如何根据命令行参数动态加载模块?

时间:2017-06-19 16:26:16

标签: python python-3.x

我的项目有一个plugins文件夹,并且使用python Project.py --plugin TestPlugin.test运行。

目录结构如下:

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

我在使用pluginloader加载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 个答案:

答案 0 :(得分:1)

为了使您的模块能够被识别,您的* .py文件需要可以从sys.path中的路径访问,或者需要位于具有__init__.py文件的目录中。此外,由于您没有进行相对导入,因此您不需要定义程序包(但如果您将插件名称声明为“相对”,则可以完全使用plugins #39;对它,即在其声明的名称前添加一个点。)

因此,请将您的目录结构设为:

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

一切都应该好。