在Go(Golang)中编写Python扩展

在Go(Golang)中编写Python扩展,python,c,go,cython,Python,C,Go,Cython,我目前使用Cython链接C和Python,并在Python代码的慢段中获得加速。然而,我想使用goroutines来实现一段非常慢(并且非常可并行化)的代码,但是它必须可以从python调用。(我已经看过了) 如果必要的话,我(有点)乐意通过C(或Cython)来建立数据结构等,但是从bug修复/避免的角度来看,避免这个额外的层是很好的 不必重新发明轮子,最简单的方法是什么?不幸的是,目前还不可能做到这一点。Go可以运行C代码(然后该C代码可以回调到Go中),但是,Go可以运行,所以Go运行时

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

如果必要的话,我(有点)乐意通过C(或Cython)来建立数据结构等,但是从bug修复/避免的角度来看,避免这个额外的层是很好的


不必重新发明轮子,最简单的方法是什么?

不幸的是,目前还不可能做到这一点。Go可以运行C代码(然后该C代码可以回调到Go中),但是,Go可以运行,所以Go运行时可以进行设置

有一个软件包可以帮助您在Go中编写Python扩展:

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


2015年更新:可能从Go 1.5开始

使用Go1.5,您可以构建.so对象并将其作为Python模块导入,直接从Python运行Go代码(而不是C)

另见

gopy从go包生成一个CPython扩展模块


我已经为setuptools编写了一个扩展,它允许您编写与go接口的cpython扩展:

这里有几个扩展示例:

最妙的是,它们可以像任何其他
pip
软件包一样安装,并且支持cpython和pypy

还可以通过
设置工具golang build manylinux wheels
工具来构建manylinux1车轮,以提供预制车轮


该方法与@ColonelPanic的答案中的方法几乎相同,但使用了一些额外的技巧来实现python2+python3的兼容性。

也许可以通过xmlrpc在单独的进程中调用go?您可以使用套接字来执行RPC。将Python嵌入C程序相当容易。我想知道你是否可以将C程序嵌入到Go程序中。。。Python和Go的交互必须通过C层进行。对于Go和Python进程之间的通信,您可以在不同的进程中运行Python程序,并使用stdin、stdout在进程之间进行通信(包os/exec)。在这方面,JSON比XMLRPC更好,因为目前在Go中使用XML比使用JSON更难一些。这在Go 1.5中是可能的-请参阅工作示例。从我所读的内容来看,
Go python
帮助您从Go调用python,而不是相反。这是我所看到的,并且已经放弃,正如@zneak所说,恰恰相反。我直接从go python自述中添加了一句话,解释了如何使用它来构建python扩展。github.com/go-python/gopy项目让这变得非常简单,为您创建博客文章提到的所有必要管道。gopy当前与Go>=1.6不兼容,因此这是短暂的。gopy已更新以支持更新版本的Go。它正在使用“c-shared”构建选项和pybindgen项目