当我尝试使用
保存自定义对象时出错 with open(path + '/' + 'my_object.pickle', 'wb') as handle:
pickle.dump(my_class_instance, handle, protocol=pickle.HIGHEST_PROTOCOL)
错误消息是:
TypeError:无法腌制SwigPyObject对象
我的第一个问题是:什么是SwigPyObject对象?,所以我可以尝试找出错误的来源。
答案 0 :(得分:6)
什么是SWIG?
Simplified Wrapper and Interface Generator(SWIG)是一种开源软件工具,用于将用C或C ++编写的库与脚本语言(例如Python)连接起来。 SWIG的一个著名替代方法是Boost。 Boost Library旨在完成同一件事。
您使用SWIG创建以C / C ++开发的Python库(以与现有C / C ++库互操作或提高性能,或其他目的)。
要构建Python扩展模块,SWIG使用分层方法,其中扩展模块的某些部分用C定义,其他部分用Python定义。 C层包含低级包装器,而Python代码用于定义高级功能。
这种分层方法认识到以下事实:扩展构建的某些方面可以在每种语言中更好地完成(而不是尝试使用C或C ++来完成所有工作)。此外,通过生成两种语言的代码,您可以获得更大的灵活性,因为您可以使用两种语言的支持代码来增强扩展模块。
什么是SwigPyObject对象?
SWIG documentation的主题“ Python类接口的更多详细信息”中介绍了SwigPyObject
对象。
此对象是实现细节。它由以下C结构定义:
typedef struct {
PyObject_HEAD
void *ptr;
swig_type_info *ty;
int own;
PyObject *next;
PyObject *dict;
} SwigPyObject;
SwigPyObject
对象存储一个C ++对象的实例:
使用
-builtin
时,纯python层被剥离。每个包装的类都转换为从SwigPyObject
继承的新的python内置类型,并且SwigPyObject
实例直接从包装的方法中返回。
修补文件
泡菜文件中包含的数据包含一个SwigPyObject
对象,但是您的解释器不知道如何对其进行反序列化。您需要检查您的virtualenv是否包含提供泡菜对象的Python / C ++库。