这是一个非常简单的C函数:
bool GetSomething(string* result)
调用此函数后,返回值应指示result
是否包含所需信息,并且用户可以检查返回值以进行相应处理。
要在SWIG中使用这个函数在Python代码中使用,我使用默认的typemaps.i
文件,然后将函数更改为
bool GetSomething(string* OUTPUT)
这可行,但仍然很麻烦。我必须这样做才能得到我想要的结果:
success, result = GetSomething()
if success:
# handle result
else:
# throw exception
理想情况下,我想改为使用这个界面:
result = GetSomething()
if result:
# handle result
任何帮助都将不胜感激。
答案 0 :(得分:4)
这是评论中提到的想法的示例.i文件。将成功的返回状态转换为None
并将失败的返回状态转换为Python中的异常,并将输出参数附加到返回值。这不需要更改C ++代码库:
%module x
%include <exception.i>
// convert non-zero int return values to exceptions
%typemap(out) int %{
if($1)
SWIG_exception(SWIG_RuntimeError,"non-zero return value");
$result = Py_None;
Py_INCREF(Py_None); // Py_None is a singleton so increment its reference if used.
%}
// Easy way for int*, but customize below for more complicated types
// %apply int* OUTPUT {int*};
// suppress the output parameter as an input.
%typemap(in,numinputs=0) int* (int tmp) %{
$1 = &tmp;
%}
// append int* output parameters to the return value.
%typemap(argout) int* {
PyObject* tmp = PyLong_FromLong(*$1);
$result = SWIG_Python_AppendOutput($result,tmp);
}
// %inline declares and exposes a function
%inline %{
int func(int val, int* pOut)
{
if(val < 1)
return 1;
*pOut = 2 * val;
return 0;
}
%}
如果你使用swig -python -c++ x.i
SWIG这个.i并将结果编译成Python扩展名:
>>> import x
>>> x.func(2)
4
>>> x.func(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: non-zero return value
答案 1 :(得分:0)
我目前的黑客,希望这有助于某人。
%{
#define GetSomething 1
%}
%typemap(out) bool %{
#if $symname == 1
if (result) {
return Py_FromString(arg0->data());
} else {
return Py_None;
}
#endif
%}