无法挑选StringO对象(尝试序列化从librsync-python模块返回的签名时)

时间:2015-03-06 17:29:16

标签: python-2.7 serialization pickle librsync

https://pypi.python.org/pypi/python-librsync/0.1-5

import librsync

# The destination file.
dst = file('Resume-v1.0.pdf', 'rb')

# Step 1: prepare signature of the destination file
signature = librsync.signature(dst)

我想将签名存储在文件中(最好使用pickle作为字典条目)。我希望之后计算delta文件。 如何保存此签名对象以供将来使用?

更新: 我试图挑选对象,但它说TypeError: can't pickle StringO objects

更新2:返回的签名对象引用了文件对象。 Python无法挑选文件对象。我使用dill解决了它,pickle是{{1}}模块的扩展版本。 添加它作为答案。

2 个答案:

答案 0 :(得分:2)

我是问题的作者,这是对我有用的解决方案。

来自http://www.ibm.com/developerworks/library/l-pypers/

  

Python无法挑选文件对象(或任何带引号的对象)   一个文件对象),因为Python不能保证它可以重新创建   在取消打印时文件的状态。

来自https://pypi.python.org/pypi/dill

  

Dill扩展了python的'pickle'模块,用于序列化和   将python对象反序列化为大多数内置python   类型。

使用dill,我可以序列化返回的签名对象。 https://github.com/uqfoundation/dill

答案 1 :(得分:1)

您不想挑选StringIO对象,而是签名的值。您需要获取对象的内容:

signature_bytes = librsync.signature(dst).getvalue()
pickle(dict(sig=signature_bytes))