我目前使用 Cython 来链接 C 和 Python,并在缓慢的 Python 代码中获得加速。但是,我想使用 goroutine 来实现一段非常慢(并且非常可并行化)的代码,但它必须可以从 python 调用。(我已经看过这个问题了)
如果有必要,我(有点)很乐意通过 C(或 Cython)设置数据结构等,但从错误修复/避免的角度来看,避免这个额外的层会很好。
无需重新发明任何轮子即可做到这一点的最简单方法是什么?
2015 年更新:可能从 Go 1.5 开始https://blog.filippo.io/building-python-modules-with-go-1-5/
使用 Go 1.5,您可以构建 .so 对象并将它们作为 Python 模块导入,直接从 Python 运行 Go 代码(而不是 C)。
另见https://github.com/go-python/gopy
gopy 从 go 包生成一个 CPython 扩展模块。
不幸的是,目前这是不可能的。Go 可以运行 C 代码(然后该 C 代码可以回调到 Go),但main
函数必须在 Go 中,因此 Go 运行时可以进行设置。
我已经为 setuptools 编写了一个扩展,它允许您编写与 go 接口的 cpython 扩展:https ://github.com/asottile/setuptools-golang
这里有几个示例扩展:
巧妙的是,它们可以像任何其他pip
软件包一样安装,并且同时支持 cpython 和 pypy。
也可以构建PEP 513setuptools-golang-build-manylinux-wheels
manylinux1 轮子以通过该工具提供预先构建的轮子。
该方法与@ColonelPanic 的答案中的方法几乎相同,但使用了一些额外的技巧来启用 python2 + python3 兼容性。
有一个go-python包正好可以帮助你在 Go 中编写 Python 扩展:
这个包提供了一个可执行的“go-python”,它只加载“python”,然后调用 python.Py_Main(os.Args)。合理的是,在这样的可执行文件下,基于 Go 的 C-Python 扩展将更容易实现(因为这通常意味着通过一些相当复杂的函数跳跃从 C 调用 go)