在Go(Golang)中编写Python扩展

我目前使用Cython来链接C和Python,并获得python代码的慢速加速。 然而,我想使用goroutines来实现一个非常慢(并且非常可并行化)的代码位,但它必须从python调用。 (我已经看到了这个问题 )

我(有点儿)很高兴通过C(或Cython)来设置数据结构等,如果有必要的话,但是从错误修复/回避的angular度来看,避免这个额外的层是很好的。

什么是最简单的方法来做到这一点,而不必重新发明任何车轮?

更新2015年 :可能从1.5开始https://blog.filippo.io/building-python-modules-with-go-1-5/

使用Go 1.5,您可以构build.so对象并将它们作为Python模块导入,直接从Python运行Go代码(而不是C)。

不幸的是,这是不可能的。 Go可以运行C代码(然后C代码可以callback到Go),但是main函数必须在Go中 ,所以Go运行时可以设置。

有一个go-python包可以帮助你在Go中编写Python扩展:

这个包提供了一个可执行的“go-python”,它只是加载“python”,然后调用python.Py_Main(os.Args)。 理性的是,在这样的可执行文件下,基于C-Python的扩展将更容易实现(因为这通常意味着从C调用一些相当复杂的函数跳转)

我已经写了一个setuptools的扩展,它允许你写cpython的扩展,与go的接口: https : //github.com/asottile/setuptools-golang

这里有几个扩展例子:

整洁的事情是这些可以像任何其他PIP包一样安装,同时支持cpython和pypy。

PEP 513 manylinux1车轮也可以通过setuptools-golang-build-manylinux-wheels工具来setuptools-golang-build-manylinux-wheels

这个方法几乎和@ ColonelPanic的答案一样,但是使用一些额外的技巧来启用python2 + python3兼容性。