50

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

如果有必要,我(有点)很乐意通过 C(或 Cython)设置数据结构等,但从错误修复/避免的角度来看,避免这个额外的层会很好。

无需重新发明任何轮子即可做到这一点的最简单方法是什么?

4

4 回答 4

44

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 扩展模块。

于 2015-09-27T21:29:39.597 回答
10

不幸的是,目前这是不可能的。Go 可以运行 C 代码(然后该 C 代码可以回调到 Go),但main函数必须在 Go 中,因此 Go 运行时可以进行设置。

于 2012-09-16T01:39:45.873 回答
3

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

这里有几个示例扩展:

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

也可以构建PEP 513setuptools-golang-build-manylinux-wheels manylinux1 轮子以通过该工具提供预先构建的轮子。

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

于 2017-02-01T05:52:20.813 回答
2

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

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

于 2012-09-17T03:28:14.087 回答