如何安全地保存和加载 sympy 对象

Mar*_*Omo 1 python numpy sympy

是否有安全保存和加载 sympy 对象的官方方法(用于通过互联网发送)?

使用np.savenp.load给出以下异常。

Traceback (most recent call last):
  File "testSave.py", line 19, in <module>
    print np.load("out.npy", out)
  File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 415, in load
    if mmap_mode:
  File "C:\Python27\lib\site-packages\sympy\core\relational.py", line 195, in __nonzero__
    raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational
Run Code Online (Sandbox Code Playgroud)

我用的是考虑sreprEq(5*x + 12 - 8, 12*x - 10)Equality(Add(Add(Mul(Integer(5), Symbol('x')), Integer(12)), Integer(-8)), Add(Mul(Integer(12), Symbol('x')), Integer(-10))),但据我所知,只有这样,才能将其加载从文本是使用parse,但我不喜欢从互联网EXEC字符串。

这与问题SymPy: Safely parsing strings as I am ok with binary 格式不同。

hpa*_*ulj 5

pickle 似乎工作

对于h1(来自之前的 SO 问题):

In [52]: h1
Out[52]: -exp(Abs(sqrt(x**2 + y**2)/pi - 1))*Abs(sin(x)*cos(y))
In [53]: type(h1)
Out[53]: sympy.core.mul.Mul

In [47]: import pickle
In [48]: pickle.dumps(h1)
Out[48]: b'\x80\x03csympy.core.mul\nMul\nq\x00csympy.core.numbers\nNegativeOne\nq\x01J\xff\xff\xff\xff\x85q\x02Rq\x03}q\x04bcsympy.functions.elementary.complexes...PRqQ}qRb\x86qSRqT}qUb\x86qVRqW}qXb\x86qYRqZ}q[b\x85q\\Rq]}q^b\x85q_Rq`}qab\x87qbRqc}qdb.'

In [50]: with open('text.txt','wb') as f:
    ...:     pickle.dump(h1,f)
    ...:       
In [51]: with open('text.txt','rb') as f:
    ...:     print(pickle.load(f))
    ...:     
-exp(Abs(sqrt(x**2 + y**2)/pi - 1))*Abs(sin(x)*cos(y))
Run Code Online (Sandbox Code Playgroud)

np.save诉诸pickle如果它可以在该对象不是保存为一个数组,但显然采用pickle直接更加可靠。 sympy对象不继承自numpy(至少基本对象不继承)。

pickle取决于sympy定义自己的编码/解码函数的类(我忘记了名字)。