在 Go (Golang) 中编写 Python 扩展

问题描述 投票:0回答:5

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

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

无需重新发明任何轮子即可实现此目的的最简单方法是什么?

python c go cython
5个回答
47
投票

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


10
投票

不幸的是,目前这是不可能的。 Go 可以运行 C 代码(然后 C 代码可以回调到 Go 中),但

main
函数必须位于 Go 中,以便 Go 运行时可以进行设置。


4
投票

我编写了 setuptools 的扩展,它允许您编写与 go 交互的 cpython 扩展:https://github.com/asottile/setuptools-golang

这里有几个示例扩展:

最棒的是,它们可以像任何其他

pip
包一样安装,并且支持 cpython 和 pypy。

PEP 513 还可以构建许多Linux1轮子,以通过

setuptools-golang-build-manylinux-wheels
工具提供预构建的轮子。

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


2
投票

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

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


0
投票

通过使用 Pygolo 项目,无需编写任何 C 代码(但仍使用 CGO)即可轻松实现此目的。查看文档:如何扩展

© www.soinside.com 2019 - 2024. All rights reserved.