ページ

2009年11月24日

golangからPythonをちょっとだけ使ってみる

やっぱりヘビが好きなので、golangでも使いたいなー、と言うことでPythonを呼び出せるようにちょっとだけしてみました。goでインタープリタを実装する時間もスキルも、モチベーションもないので、CPYthonを呼び出すだけです。半分cgoのお勉強です。

まず、Pythonのコードを呼び出すようなテストコードgopy.goを書きます。pyで始まるようなところが、Pythonのラッパーです。Macでしか動かないMakefileです。


package main

import (
"py";
"fmt";
)

func main() {
fmt.Print("init\n");
py.Initialize();
fmt.Print("init done\n");
result := py.Run_SimpleString("print 'hello'");
fmt.Printf("script done %d\n", result);
py.Finalize();
fmt.Print("finalize done\n");
}


次にPythonのラッパー。とりあえず、テスト用なのでPy_Initialize, Py_Finalyze, PyRun_SimpleStringをラップします。次のコードgopywrapper.goがそれ。この人からCのコードとgoのコードが作られます。最初の方のコメントの部分がCと仲良くするための魔法です。

package py
/*
#include
*/
import (
"C";
)

func Initialize() {
C.Py_Initialize();
}

func Run_SimpleString(script string) int {
return int(C.PyRun_SimpleStringFlags(C.CString(script), nil));
}

func Run_Simple

func Finalize() {
C.Py_Finalize();
}



あとは、Makefileを書くだけです。実はこの人を作るのが一番時間がかかったかも。なぜかは、うーん、typo。でMakefile。


include $(GOROOT)/src/Make.$(GOARCH)

TARG=py
CGOFILES=\
gopywrapper.go

CGO_LDFLAGS+=-lpython -u _PyMac_Error /Library/Frameworks/Python.framework/Versions/2.6/Python
CGO_CFLAGS=-I/usr/include/python2.6/ $(CGO_FLAGS)
CFLAGS=-I/usr/include/python2.6/

LDFLAGS=-u _PyMac_Error /Library/Frameworks/Python.framework/Versions/2.6/Python

include $(GOROOT)/src/Make.pkg

%: gopywrapper.o install %.go
$(GC) $*.go
$(LD) -o $@ $*.$O

gopywrapper.o: gopywrapper.c
gcc -fPIC -O2 -o gopywrapper.o -c gopywrapper.c

gopy: install gopy.go
$(GC) gopy.go
$(LD) -o $@ gopy.$O



これで、make gopyとやれば、gopyという実行ファイルができます。./gopyを実行すると、


init
init done
hello
script done 0
finalize done


めでたしめでたし。次はこのへんをできるように・・・。

0 件のコメント: