我有一些C代碼,我想暴露給Python。它有一個調用約定是這樣的:%typemap和%exception for C語言錯誤代碼爲SWIG,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
雜牌:
%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
kludge將分解。
解決這個問題的最好方法是什麼,而不改變C代碼的調用約定?
爲什麼錯誤添加負數? – 2012-02-26 20:34:27
我懷疑這是一個簡單的例子,它實際上是一個更復雜的函數,顯示了它的方式 – Flexo 2012-02-26 20:40:42
是正確的。完整的應用程序是http://ascend4.org/FPROPS,這是一個流體屬性庫。 – jdpipe 2012-02-26 21:02:54