代码之家  ›  专栏  ›  技术社区  ›  paolof89

什么是SwigPyObject对象?

  •  22
  • paolof89  · 技术社区  · 8 年前

    当我试图用保存自定义对象时出错

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

    TypeError:无法pickle SwigPyObject对象

    我的第一个问题是: 什么是SwigPyObject对象?

    1 回复  |  直到 8 年前
        1
  •  16
  •   Community Mohan Dere    5 年前

    这个 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代码用于定义高级功能。

    什么是SwigPyObject对象?

    这个 SwigPyObject 对象在主题中进行了描述。有关Python类接口的更多详细信息,请参阅 SWIG documentation .

    typedef struct {
        PyObject_HEAD
        void *ptr;
        swig_type_info *ty;
        int own;
        PyObject *next;
        PyObject *dict;
    } SwigPyObject;
    

    SwigPyObject 对象存储C++对象的实例:

    -builtin 使用时,剥离了纯python层。每个包装的类都被转换为一个新的python内置类型,该类型继承自 SwigPyObject

    pickle文件

    pickle文件中包含的数据包含 SwigPyObject 对象,但您的解释器不知道如何将其反序列化。您需要检查virtualenv是否包含提供pickle对象的Python/C++库。