c结构中的以下内容已经用swig包装,以便我可以在python中访问从另一个swig包装程序获取的数据。
struct RadarParm {
struct {
char major;
char minor;
} revision;
struct {
char code;
char *time;
char *command;
} origin;
int16 cp;
int16 stid;
int16 *pulse;
int16 *lag[2];
char *combf;
};
我的主要问题是int16 * lag [2]。当我尝试用我的python代码读取数据时:
p_data['lag'] = prm.lag
其中prm是从rtserver.c文件返回的类型,通过方法struct RadarParm * getRadarParm()和p_data是一个存储RadarParm的每个部分的python字典。
这是我访问prm.lag时的当前输出:
<Swig Object of type 'int16 **' at 0x1fd55d0>
我发现似乎有一个处理数组和int16数据类型的numpy.i文件。根据我的有限理解,我认为这将允许我访问这些数据。如果我能正确实现它。
这是我到目前为止所做的:
%init %{
import_array();
%}
%apply (int16** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) {(int16* lag,2)};
编译时我得到:
Error: Syntax error in input(1).
关于如何使这项工作的任何想法?
答案 0 :(得分:0)
在这种情况下,numpy.i无效。主要问题是numpy.i不支持(out)类型图,在这种情况下,这正是我所需要的。
在编译swig rtserver.i文件时使用命令-debug-tmsearch。使用命令的输出我能够确定RadarParm :: lag的定义swig类型及其应该是什么。这是有效的代码。
%typemap(out) int16*[2] {
int i;
$result = PyList_New(2);
for (i = 0; i < 2; i++) {
PyObject *o = PyInt_FromLong($1[i]);
PyList_SetItem($result,i,o);
}
}
%apply int16*{lag[2]};
大部分内容取自this answer