天天看点

linux+swig+python,包装和使用函数返回一个结构与SWIG(python)的问题

我的情况是这样的:

我用包裹SWIG一个相对简单的C++接口,这样我就可以使用Python使用它。这件事很复杂,但是,通过这一事实的方法之一返回一个自定义的结构,其定义如下:

struct DashNetMsg {

uint64_t timestamp;

char type[64];

char message[1024];

};

这里是实现这个我痛饮接口文件:

%module DashboardClient

%{

#include "aos/atom_code/dashboard/DashNetMsg.h"

#include "DashboardClient.h"

%}

%import "aos/atom_code/dashboard/DashNetMsg.h"

%include "DashboardClient.h"

%ignore Recv(DashNetMsg *);

“DashboardClient.h”和“DashboardClient.cpp”声明并定义了我要打包的类“DashboardClient”及其方法。 “DashNetMsg.h”是一个头文件,它除了上面的结构定义之外几乎不包含任何内容。下面是定义为DashboardClient.Recv方法,从DashboadClient.cpp:

DashNetMsg DashboardClient::Recv() {

DashNetMsg ret;

if (Recv(&ret)) {

// Indicate a null message

strcpy(ret.type, "NullMessage");

}

return ret;

}

两个有趣的和(我认为),当我编译此出现并将其加载到蟒蛇相互关联的问题:

Python 3.1.3 (r313:86834, Nov 28 2010, 10:01:07)

[GCC 4.4.5] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import DashboardClient

>>> d = DashboardClient.DashboardClient()

>>> m = d.Recv()

>>> m

>>> m.type

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'SwigPyObject' object has no attribute 'type'

>>> exit()

swig/python detected a memory leak of type 'DashNetMsg *', no destructor found.

首先,DashNetMsg显然确实定义了一个名为“type”的属性。其次,这是什么内存泄漏?据痛饮:

痛饮创造,如果没有在接口中定义 默认的构造函数和析构函数。

不意味着它应该创造这个包裹式析构函数? 另外,为什么我不能访问我的结构的属性?

的解决方案,没有工作可以解释发生了什么

我最好的猜测是,SWIG由于某种原因没有实际包装DashNetMsg结构,转而把它当作一个不透明的指针。因为SWIG似乎表明释放这些指针必须手动完成,所以我猜也可以解释内存泄漏。但是,即便是这种情况,我也不明白为什么SWIG不会包装结构。

我读了here swig必须有声明C风格的结构才能识别它们。因此,我试过这个:

typedef struct DashNetMsg {

uint64_t timestamp;

char type[64];

char message[1024];

} DashNetMsg;

它和上面的结果完全一样。

2013-09-11

djpetti