Skip to content
This repository was archived by the owner on Jul 24, 2023. It is now read-only.

sbinet/go-python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

9a5a20a · Jul 24, 2023
Feb 8, 2013
Jun 15, 2019
Jun 14, 2019
Mar 26, 2020
Nov 18, 2010
Nov 26, 2014
Jul 24, 2023
Mar 26, 2020
Mar 26, 2020
Jan 18, 2019
Jan 18, 2019
Sep 1, 2017
Jan 26, 2017
Jan 26, 2017
Mar 27, 2019
Jan 18, 2019
Sep 1, 2015
Mar 22, 2018
Sep 1, 2015
Mar 26, 2020
Mar 26, 2020
Aug 7, 2018
Aug 7, 2018
Jun 15, 2019
Jun 15, 2019
Jun 15, 2019
Jan 26, 2017
Jan 26, 2017
Jan 16, 2017
Apr 1, 2016
Jun 15, 2019
Mar 22, 2018
Sep 1, 2015
Aug 6, 2018
May 19, 2016

Repository files navigation

go-python

sbinet/go-python only supports CPython2. CPython2 isn't supported anymore by python.org. Thus, sbinet/go-python is now archived. A possible alternative may be to use and contribute to go-python/cpy3 instead.

Build Status Build status GoDocs

Naive go bindings towards the C-API of CPython-2.

this package provides a go package named "python" under which most of the PyXYZ functions and macros of the public C-API of CPython have been exposed.

theoretically, you should be able to just look at:

http://docs.python.org/c-api/index.html

and know what to type in your go program.

this package also provides an executable "go-python" which just loads "python" and then call python.Py_Main(os.Args). the rational being that under such an executable, go based extensions for C-Python would be easier to implement (as this usually means calling into go from C through some rather convoluted functions hops)

Install

With Go 1 and the go tool, cgo packages can't pass anymore additional CGO_CFLAGS from external programs (except pkg-config) to the "fake" #cgo preprocessor directive.

go-python now uses pkg-config to get the correct location of headers and libraries. Unfortunately, the naming convention for the pkg-config package is not standardised across distributions and OSes, so you may have to edit the cgoflags.go file accordingly.

 $ go get github.com/sbinet/go-python

If go get + pkg-config failed:

 $ cd go-python
 $ edit cgoflags.go
 $ make VERBOSE=1

Note: you'll need the proper header and python development environment. On Debian, you'll need to install the python-all-dev package

Documentation

Is available on godocs:

https://godocs.io/github.com/sbinet/go-python

Example:

package main

import "fmt"
import "github.com/sbinet/go-python"

func init() {
   err := python.Initialize()
   if err != nil {
          panic(err.Error())
   } 
}

func main() {
 	 gostr := "foo" 
	 pystr := python.PyString_FromString(gostr)
	 str := python.PyString_AsString(pystr)
	 fmt.Println("hello [", str, "]")
}
$ go run ./main.go
hello [ foo ]

TODO:

  • fix handling of integers (I did a poor job at making sure everything was ok)

  • add CPython unit-tests

  • do not expose C.FILE pointer and replace it with os.File in "go-python" API

  • provide an easy way to extend go-python with go based extensions

  • think about the need (or not) to translate CPython exceptions into go panic/recover mechanism

  • use SWIG to automatically wrap the whole CPython api ?