我正在编写一个简单的调度服务。我不想硬编码它可以安排的所有任务,而是希望支持可以放在文件夹中并在运行时动态加载的插件。
我的计划是有一个 JSON 文件(或任何配置文件),将任务名称映射到 Python 文件(模块)的位置,该文件将有一个名为Plugin
. 很简单,我想。当有人安排任务运行时,他们会传递任务名称和运行时间。当时间过去时,插件被加载(或重新加载)并使用传递给调度程序的任何附加参数运行。
我一直在查看imp
模块以了解如何在运行时加载模块。我不确定我是想使用它们的物理位置(文件系统路径)列出插件还是使用它们的模块名称,就像你在import
声明中看到的那样。它似乎imp
想使用物理位置。
我得到了这个代码“工作”的两个不同版本。这是一个使用importlib
:
pluginName = self.__pluginLookup[pluginName]
module = import_module(pluginName)
module = reload(module) # force reload
plugin = module.Plugin()
return plugin
这是我写的一个imp
:
path = self.__pluginLookup[pluginName]
path, moduleName = split(path)
moduleName, extension = splitext(moduleName)
file, path, description = find_module(moduleName, [path])
with file:
module = load_module(moduleName, file, path, description)
plugin = module.Plugin()
return plugin
我遇到的问题是处理依赖项。如果我有一个plugin.py
文件依赖于dependency.py
同一文件夹中的文件,那么说import dependency
似乎不起作用。相反,它从PYTHONPATH
.
我怎样才能使导入相对于插件本身?