【问题标题】:Pickling objects imported with importlib.util酸洗使用 importlib.util 导入的对象
【发布时间】:2017-05-06 11:00:56
【问题描述】:

我在使用 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 语句导入的对象,则不会发生这种情况。我怎样才能绕过这个?

【问题讨论】:

    标签: python pickle python-importlib


    【解决方案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
    

    【讨论】:

    • 中间模块也需要添加,否则导入会失败。
    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多