我的项目有一个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很新,我知道我可能没有正确设置模块,但我不确定原因。
答案 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
一切都应该好。