ページ

2009年11月26日

golangからPythonの関数を呼び出してみる

前回の続きです。golangのコードからPythonの関数を呼び出してみました。とりあえず、Pythonのドキュメントのここに書いてあることができるようになりました。とりあえず、動くことを目標にしているので、わざとはっしょってたりしています。golangは簡単にCのコードを呼び出せるのはいいのですが、ほとんど考えることがないので、ラッパーを自動生成できないのかな?

ついでに、macroはいやーん、だと思っていましたが、
package "py"

/*
#import "myheader.h"

void wrapper_func(int v) { SOME_MACRO(v); }
*/
import "C"
みたいな感じにしておけば、使えるのか・・・。

で、今のコードはgithubにいます。こんな感じになります。




func setArgs(pArgs *py.Object, index int, value int) bool {
pValue := py.Int_FromLong(value);
if pValue == nil {
fmt.Printf("Value : %d\n", value);
py.Err_Print();
return false;
}
pArgs.Tuple_SetItem(index, pValue);
return true;
}

func runFunc(pythonfile string, funcname string, arg []int) {
fmt.Printf("--- runFunc ------------------------------\n");
pName := py.String_FromString(pythonfile);
pModule := py.Import_Import(pName);
fmt.Printf("import done \n");
pName.DecRef();
if pModule != nil {
fmt.Printf("pModule %t\n", pModule);
pFunc := pModule.GetAttrString(funcname);
if pFunc != nil && pFunc.Callable_Check() != 0 {
pArgs := py.Tuple_New(2);
if setArgs(pArgs, 0, arg[0]) == false {
pArgs.DecRef();
pModule.DecRef();
fmt.Printf("Cannot Convert Argument\n");
return;
}
if setArgs(pArgs, 1, arg[1]) == false {
pArgs.DecRef();
pModule.DecRef();
fmt.Printf("Cannot Convert Argument\n");
return;
}
pValue := pFunc.CallObject(pArgs);
pArgs.DecRef();
if pValue != nil {
fmt.Printf("Result of call: %d\n", pValue.Int_AsLong());
pValue.DecRef();
} else {
pFunc.DecRef();
pModule.DecRef();
py.Err_Print();
fmt.Printf("Call Failed\n");
}
} else {
if py.Err_Occurred() != nil {
py.Err_Print();
}
fmt.Printf("Cannot find function %s\n", funcname);
}
py.XDecRef(pFunc);
pModule.DecRef();
} else {
py.Err_Print();
fmt.Print("error\n\n");
}
fmt.Printf("--- runFunc done ---\n\n");
}


でも、こっちをみたほうがわかりやすい。

でわでわ

0 件のコメント: