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 (将#修改为@)