编程语言
首页 > 编程语言> > 为C(指针)创建python的Swig包装器

为C(指针)创建python的Swig包装器

作者:互联网

我是swig的一个新手,我正在尝试创建一个swig包装器,以便在python中使用一些C文件.我有以下C类.

以下是我尝试转换的代码的片段:

/*packet_buffer.h*/
class CPacketBuffer {
 public:
    // construct based on given buffer, data is not copied
    CPacketBuffer(uint8_t* data, uint32_t length) {
        mpBuffer = data;
        mLength  = length;
        mHead    = 0;
        mTail    = length;
    }
    uint8_t* GetBuffer() {
        return (mpBuffer + mHead);
    }
    void Add(const uint8_t* data, uint32_t length) {
            if ((mTail + length) > mLength) {
            length = (mLength - mTail);
        }
//....
}

我一直在尝试编写一个example.i文件,该文件今天可以使用swig文档的帮助全天接受指向typedefs(uint8_t *)的指针,但是我一直没有成功.

以下是我尝试过的packet_buffer.i文件,该文件不起作用.

%module packet_buffer
%include typemaps.i
%apply unsigned char* {uint8_t*};
%apply unit8_t *INPUT {uint8_t *data};



%{
    #define SWIG_FILE_WITH_INIT
    #include "../include/packet_buffer.h"
%}
%include "../include/packet_buffer.h"

>如何为使用指向typedef的指针的成员函数编写Swig代码?
>我可以编写可在代码中使用的通用%apply,还是必须为每个INPUT,OUTPUT参数编写详细信息?

解决方法:

如果我正确地理解了这一点,那么您面临的问题不是它们是指针,而是它们可能是无界数组.

您可以使用carrays.i和“%array_class”宏,例如warp an unbounded C array,例如:

%module packet
%include "stdint.i"

%{
    #include "packet.h"
%}

%include "carrays.i"
%array_class(uint8_t, buffer);

%include "packet.h"

然后将允许您在Py​​thon中编写类似以下内容的内容:

a = packet.buffer(10000000) 
p = packet.CPacketBuffer(a.cast(), 10000000)

请注意,您需要确保缓冲区的寿命足够长-如果在不了解C代码的情况下释放了Python对象,则最终将导致不确定的行为.

您可以使用%array_class宏也创建的frompointer方法将uint8_t *指针(无边界数组)转换为Python中的缓冲区实例,例如:

r = packet.GetBuffer()
buf = packet.buffer_frompointer(r)

如果需要,您可以使用add additional Python code自动执行/隐藏缓冲区之间的大多数转换,或者使用MemoryViews在C API方面与Python进行更紧密的集成.

总的来说,虽然这是C语言,但我建议为此使用std :: vector -在Python端使用它比无边界数组要好得多,并且这样做的安全性和简便性使代价最小.

标签:swig,distutils,python,pointers
来源: https://codeday.me/bug/20191201/2080222.html