使用importlib.util导入的酸洗对象

时间:2017-05-06 11:00:57

标签: python pickle python-importlib

我在使用Python的泡菜时遇到了问题。我需要通过将文件路径提供给importlib.util来加载一些Python模块,如下所示:

(\w+ (=|>|<|>=|<=|!=) \w+)

我想从加载的模块中实例化一些对象并将它们序列化以供以后使用,但是当我尝试时:

import importlib.util
spec = importlib.util.spec_from_file_location('custom', 'C:\path\to\.py\file.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)

我明白了: _pickle.PicklingError:不能腌制:导入模块&#39; custom&#39;失败

如果我尝试挑选通过import语句导入的对象,则不会发生这种情况。我怎么能绕过这个?

2 个答案:

答案 0 :(得分:1)

使其工作最简单的方法是通过以下方式将模块手动添加到sys.module中:

import importlib.util
import sys

spec = importlib.util.spec_from_file_location('custom', 'C:\path\to\.py\file.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules['custom'] = module

答案 1 :(得分:0)

Pickle取决于模块路径。因此,您应确保模块custom位于sys.path

在类似的应用程序中,我可以通过执行以下操作来使其工作:

file_path = 'C:\path\to\.py\file.py'
dir_name = os.path.dirname(file_path)
if dir_name not in sys.path:
    sys.path.append(dir_name)