diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..9b9333d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: go +before_install: + - sudo apt-get install -qq python2.7-dev + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..85eda82 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +#CHANGELOG + +## v1.0.01 + +2013-03-10 + +Issue [#5](https://github.com/qiniu/py/pull/5): + +- 增加 gomodule 样例 +- Travis-CI 支持 + diff --git a/README.md b/README.md index 1efa08c..7466251 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,89 @@ py == -Golang bindings to the CPython C-API \ No newline at end of file +Golang bindings to the CPython C-API + +# Summary + +py is Golang bindings to the CPython C-API. + +py project's homepage is: https://github.com/qiniu/py + + +# Install + +``` +go get github.com/qiniu/py +``` + +# Example + +``` +package main + +import ( + "fmt" + "github.com/qiniu/log" + "github.com/qiniu/py" +) + +// ------------------------------------------------------------------- + +type FooModule struct { +} + +func (r *FooModule) Py_bar(args *py.Tuple) (ret *py.Base, err error) { + var i int + var s string + err = py.Parse(args, &i, &s) + if err != nil { + return + } + fmt.Println("call foo.bar:", i, s) + return py.IncNone(), nil +} + +func (r *FooModule) Py_bar2(args *py.Tuple) (ret *py.Base, err error) { + var i int + var s []string + err = py.ParseV(args, &i, &s) + if err != nil { + return + } + fmt.Println("call foo.bar2:", i, s) + return py.IncNone(), nil +} + +// ------------------------------------------------------------------- + +const pyCode = ` + +import foo +foo.bar(1, 'Hello') +foo.bar2(1, 'Hello', 'world!') +` + +func main() { + + gomod, err := py.NewGoModule("foo", "", new(FooModule)) + if err != nil { + log.Fatal("NewGoModule failed:", err) + } + defer gomod.Decref() + + code, err := py.Compile(pyCode, "", py.FileInput) + if err != nil { + log.Fatal("Compile failed:", err) + } + defer code.Decref() + + mod, err := py.ExecCodeModule("test", code.Obj()) + if err != nil { + log.Fatal("ExecCodeModule failed:", err) + } + defer mod.Decref() +} + +// ------------------------------------------------------------------- +``` + diff --git a/examples/gomodule/gomodule.go b/examples/gomodule/gomodule.go new file mode 100644 index 0000000..4205840 --- /dev/null +++ b/examples/gomodule/gomodule.go @@ -0,0 +1,67 @@ +package main + +import ( + "fmt" + "github.com/qiniu/log" + "github.com/qiniu/py" +) + +// ------------------------------------------------------------------- + +type FooModule struct { +} + +func (r *FooModule) Py_bar(args *py.Tuple) (ret *py.Base, err error) { + var i int + var s string + err = py.Parse(args, &i, &s) + if err != nil { + return + } + fmt.Println("call foo.bar:", i, s) + return py.IncNone(), nil +} + +func (r *FooModule) Py_bar2(args *py.Tuple) (ret *py.Base, err error) { + var i int + var s []string + err = py.ParseV(args, &i, &s) + if err != nil { + return + } + fmt.Println("call foo.bar2:", i, s) + return py.IncNone(), nil +} + +// ------------------------------------------------------------------- + +const pyCode = ` + +import foo +foo.bar(1, 'Hello') +foo.bar2(1, 'Hello', 'world!') +` + +func main() { + + gomod, err := py.NewGoModule("foo", "", new(FooModule)) + if err != nil { + log.Fatal("NewGoModule failed:", err) + } + defer gomod.Decref() + + code, err := py.Compile(pyCode, "", py.FileInput) + if err != nil { + log.Fatal("Compile failed:", err) + } + defer code.Decref() + + mod, err := py.ExecCodeModule("test", code.Obj()) + if err != nil { + log.Fatal("ExecCodeModule failed:", err) + } + defer mod.Decref() +} + +// ------------------------------------------------------------------- + diff --git a/python.go b/python.go index e50d07e..bab04d5 100644 --- a/python.go +++ b/python.go @@ -1,7 +1,7 @@ package py /* -#cgo CFLAGS: -Werror -I/usr/local/include/python2.7 +#cgo CFLAGS: -Werror -I/usr/local/include/python2.7 -I/usr/include/python2.7 #cgo LDFLAGS: -lpython2.7 #include