我目前使用 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 扩展模块。
我编写了 setuptools 的扩展,它允许您编写与 go 交互的 cpython 扩展:https://github.com/asottile/setuptools-golang
这里有几个示例扩展:
最棒的是,它们可以像任何其他
pip
包一样安装,并且支持 cpython 和 pypy。
PEP 513 还可以构建许多Linux1轮子,以通过
setuptools-golang-build-manylinux-wheels
工具提供预构建的轮子。
该方法与@ColonelPanic 的答案几乎相同,但使用了一些额外的技巧来启用 python2 + python3 兼容性。
有一个 go-python 包正是可以帮助你在 Go 中编写 Python 扩展:
这个包提供了一个可执行文件“go-python”,它只加载 “python”,然后调用 python.Py_Main(os.Args)。理性存在 在这样的可执行文件下,C-Python 的基于 go 的扩展将 更容易实现(因为这通常意味着从 C 调用 go 通过一些相当复杂的函数跳跃)
通过使用 Pygolo 项目,无需编写任何 C 代码(但仍使用 CGO)即可轻松实现此目的。查看文档:如何扩展。