8

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

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.dump(module.ObjectFromModule(), open('C:\object\location\obj.p', 'wb'))

我明白了: _pickle.PicklingError: Can't pickle : import of module 'custom' failed

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

4

2 回答 2

5

使其工作的最简单方法是通过以下方式手动将模块添加到 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
于 2018-12-09T20:02:18.607 回答
1

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)
于 2017-11-20T09:58:02.277 回答