什么是SwigPyObject对象?

时间:2017-08-09 09:19:54

标签: python pickle

当我尝试使用

保存自定义对象时出错

with open(path + '/' + 'my_object.pickle', 'wb') as handle: pickle.dump(my_class_instance, handle, protocol=pickle.HIGHEST_PROTOCOL)

错误消息是:

  

TypeError:无法腌制SwigPyObject对象

我的第一个问题是:什么是SwigPyObject对象?,所以我可以尝试找出错误的来源。

1 个答案:

答案 0 :(得分:6)

什么是SWIG?

Simplified Wrapper and Interface Generator(SWIG)是一种开源软件工具,用于将用C或C ++编写的库与脚本语言(例如Python)连接起来。 SWIG的一个著名替代方法是Boost。 Boost Library旨在完成同一件事。

您使用SWIG创建以C / C ++开发的Python库(以与现有C / C ++库互操作或提高性能,或其他目的)。

引用SWIG documentation

  

要构建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 ++库。