我需要将一个Python3对象pickle成一个字符串,我想从Travis CI构建中的环境变量中取消pickle.问题是,我似乎找不到在Python3中pickle到可移植字符串(unicode)的方法:
import os, pickle
from my_module import MyPickleableClass
obj = {'cls': MyPickleableClass, 'other_stuf': '(...)'}
pickled = pickle.dumps(obj)
# raises TypeError: str expected, not bytes
os.environ['pickled'] = pickled
# raises UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb (...)
os.environ['pickled'] = pickled.decode('utf-8')
pickle.loads(os.environ['pickled'])
有没有办法将复杂对象(如datetime.datetime
)序列化为unicode或Python3中的其他字符串表示形式,我可以将其传输到另一台机器并反序列化?
使现代化
我已经测试了@kindall建议的解决方案,但pickle.dumps(obj, 0).decode()
会带来UnicodeDecodeError
.尽管如此,base64方法仍然有效,但需要extra decode/encode步.该解决方案对两种Python 都有效.x和Python 3.十、
# encode returns bytes so it needs to be decoded to string
pickled = pickle.loads(codecs.decode(pickled.encode(), 'base64')).decode()
type(pickled) # <class 'str'>
unpickled = pickle.loads(codecs.decode(pickled.encode(), 'base64'))