微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dill/Marshal 反序列化后的 NameError

如何解决Dill/Marshal 反序列化后的 NameError

我正在尝试使用 marshaldill 转储一段已编译的 Python 代码

代码是用compiled(src,"<source>","exec",optimize=2)编译的,编译后的代码运行良好。

然而,当编译后的代码使用 dillmarshal 转储并再次加载时, 代码引发 NameError,如下例所示。

代码示例:

  1. 文件source.py
    import sympy
    pp = sympy.pprint
    x = sympy.Symbol("x")
    def p(*args):
       try:
          pp(*args)
       except TypeError:
          print(*args)
    p(5*x+1)
    
  2. 文件compiler.py
    import dill
    #import marshal
    
    with open("source.py") as fp:
       src = fp.read()
    compiled = compile(src,optimize=2)
    exec(compiled)             # ok
    obj = dill.dumps(compiled)
    loaded = dill.loads(obj)
    exec(loaded)               # NameError: name "pp" is not defined
    

我该如何解决这个问题?如果这是预期的行为,是否有任何替代方法可以序列化/反序列化编译后的代码? (我还不担心安全问题。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。