我正在尝试将我没有编写的 10 年历史事件侦听器从 Python 2.7 升级到 python 3.7。我遇到的基本问题是原始脚本导入其插件的方式。原始脚本背后的想法是,任何放入“plugins”文件夹的python文件,里面有一个“registerCallbacks”函数,它会自动加载到事件监听器中并运行。多年来,它一直在许多工作室中运行良好,但 Python 3.7 根本不喜欢它。
原代码的文件夹结构如下:
EventListenerPackage
src
event_listener.py
plugins
plugin_1.py
plugin_2.py
从这里,您可以看到事件侦听器和插件都保存在彼此平行的文件夹中,而不是嵌套的。
原来的代码是这样写的:
# Python 2.7 implementation
import imp
class Plugin(object):
def __init__(self, path):
self._path = 'c:/full/path/to/EventListenerPackage/plugins/plugin_1.py'
self._pluginName = 'plugin_1'
def load(self):
try:
plugin = imp.load_source(self._pluginName, self._path)
except:
self._active = False
self.logger.error('Could not load the plugin at %s.\n\n%s', self._path, traceback.format_exc())
return
regFunc = getattr(plugin, 'registerCallbacks', None)
由于 Python 3 导入模块方式的变化(据我所知)的性质,其他留言板似乎都没有让我得到答案。
我尝试了几种不同的方法,迄今为止最好的方法是:
如何在给定完整路径的情况下导入模块?
我尝试了几种不同的方法,包括将完整路径添加到 sys.path,但我总是得到“ModuleNotFoundError”。
这里大概是我现在的位置。
import importlib.util
import importlib.abc
import importlib
class Plugin(object):
def __init__(self, path):
self._path = 'c:/full/path/to/EventListenerPackage/plugins/plugin_1.py'
self._pluginName = 'plugin_1'
def load(self):
try:
spec = importlib.util.spec_from_file_location('plugins.%s' % self._pluginName, self._path)
plugin = importlib.util.module_from_spec(spec)
# OR I HAVE ALSO TRIED
plugin = importlib.import_module(self._path)
except:
self._active = False
self.logger.error('Could not load the plugin at %s.\n\n%s', self._path, traceback.format_exc())
return
regFunc = getattr(plugin, 'registerCallbacks', None)
有没有人对我如何使用给定的文件夹结构实际导入这些模块有任何见解?提前致谢。