【发布时间】:2012-02-26 20:12:13
【问题描述】:
我有一些 C 代码想要公开给 Python。它有一个这样的调用约定:
int add(int a, int b, int *err)
返回值将是 (a+b) 或其他值,但如果出现问题,我会在 *err 中得到错误代码。从 Python 的角度来看,我想包装这个函数,使其行为如下:
def add(a,b):
if something_bad:
raise RuntimeError("something bad")
return a+b
这应该很容易吧?但我不这么认为。
这是我有的东西,但请注意myerr3 kludge:
%module myswig
%feature("autodoc","1");
%{
int add(int a, int b, int *err){
if(a < 0)*err = 1;
if(b < 0)*err = 2;
return a+b;
}
char *err_string(int err){
switch(err){
case 1:return "first argument was less than 0";
case 2:return "second argument was less than 0";
default:return "unknown error";
}
}
%}
%typemap(in,numinputs=0) int *err (int myerr = 0){
$1 = &myerr;
};
%exception{
$action
if(myerr3 != 0){
PyErr_SetString(PyExc_RuntimeError,err_string(myerr3));
return NULL;
}
};
int add(int a, int b, int *err);
这表现得像它应该的那样,例如
import myswig
print "add(1,1) = "
print myswig.add(1,1)
# prints '2'
print "add(1,-1) = "
print myswig.add(1,-1)
# raises an exception
# we never get here...
print "here we are"
但我不能真正使用这个解决方案,因为如果我有另一个类似的功能
int add(int a, int b, int c, int *err)
那么我的myerr3 杂物就会坏掉。
在不改变 C 代码的调用约定的情况下,解决这个问题的更好方法是什么?
【问题讨论】:
-
为什么加负数会报错?
-
我怀疑这是一个简单的例子,实际上是一个更复杂的函数,显示了它指示成功/失败的方式
-
没错。完整的应用程序是ascend4.org/FPROPS,这是一个流体属性库。