将一些代码行插入到 SWIG Python 生成的函数中
Insert some lines of code into SWIG Python generated function
我使用 swig 为我的 C++ 库生成 Python 绑定。我想导出一个方法,其中 return 是一个数字和一个 numpy 数组。
生成包装代码非常容易。
%apply (uint8_t** ARGOUTVIEWM_ARRAY3, int* DIM1, int* DIM2, int* DIM3) {(uint8_t** frame, int *dim1, int *dim2, int *dim3)}
int get_frame(uint8_t** frame, int *dim1, int *dim2, int *dim3);
但是,get_frame() 在某些情况下会将帧指针设置为 NULL,我想 Python 方法将 return None 而不是 numpy 数组.目前,如果 frame 为 NULL,生成的代码将引发系统错误。
我的解决方案是在生成的函数 _wrap_get_frame.
中插入一些代码行
if (*arg1 == NULL)
{
Py_INCREF(Py_None);
resultobj = SWIG_Python_AppendOutput(resultobj, Py_None);
return resultobj;
}
我已经测试了这个新功能,它有效。
如何让 swig 自动执行此更改?
谢谢!
大家可以看看Henri Menke的评论。这是我的解决方案:
我添加了一个异常处理程序以将我的代码插入函数调用下方。
%exception get_frame {
errno = 0;
$action
if (errno != 0)
{
resultobj = SWIG_From_int((int)(result));
Py_INCREF(Py_None);
resultobj = SWIG_Python_AppendOutput(resultobj, Py_None);
return resultobj;
}
}
从生成的代码中使用变量 resultobj 不是通用的解决方案,但它适用于我的 SWIG 4.0。
我使用 swig 为我的 C++ 库生成 Python 绑定。我想导出一个方法,其中 return 是一个数字和一个 numpy 数组。 生成包装代码非常容易。
%apply (uint8_t** ARGOUTVIEWM_ARRAY3, int* DIM1, int* DIM2, int* DIM3) {(uint8_t** frame, int *dim1, int *dim2, int *dim3)}
int get_frame(uint8_t** frame, int *dim1, int *dim2, int *dim3);
但是,get_frame() 在某些情况下会将帧指针设置为 NULL,我想 Python 方法将 return None 而不是 numpy 数组.目前,如果 frame 为 NULL,生成的代码将引发系统错误。
我的解决方案是在生成的函数 _wrap_get_frame.
if (*arg1 == NULL)
{
Py_INCREF(Py_None);
resultobj = SWIG_Python_AppendOutput(resultobj, Py_None);
return resultobj;
}
我已经测试了这个新功能,它有效。
如何让 swig 自动执行此更改?
谢谢!
大家可以看看Henri Menke的评论。这是我的解决方案:
我添加了一个异常处理程序以将我的代码插入函数调用下方。
%exception get_frame {
errno = 0;
$action
if (errno != 0)
{
resultobj = SWIG_From_int((int)(result));
Py_INCREF(Py_None);
resultobj = SWIG_Python_AppendOutput(resultobj, Py_None);
return resultobj;
}
}
从生成的代码中使用变量 resultobj 不是通用的解决方案,但它适用于我的 SWIG 4.0。