使用Go(Golang)编写Python扩展

51

目前我使用Cython将C和Python链接起来,在Python代码的慢部分中获得加速。然而,我想使用goroutines实现一个非常缓慢(且非常可并行化)的代码块,但必须可以从Python调用。(我已经看到了这个问题

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

没有重复造轮子,最简单的方法是什么?

4个回答

47

4
github.com/go-python/gopy 项目使这变得非常简单,为您创建了所有必要的管道,正如博客文章所提到的那样。 - Chris Townsend
4
目前来看,gopy 不支持 Go1.6 及以上版本,所以它的使用寿命很短。 - mattmc3
1
gopy已更新以支持较新版本的Go。它正在使用“c-shared”构建选项和pybindgen项目。 - dre-hh

10

很遗憾,目前还不可能。Go语言可以运行C代码(这些C代码可以回调到Go语言),但是main函数必须是在Go语言中,这样Go运行时才能设置好一些东西。


1
也许可以通过xmlrpc在单独的进程中调用go? - jsbueno
2
你可以使用套接字来进行RPC。 - Vladimir Matveev
2
将Python嵌入C程序中非常容易。我想知道是否可以将那个C程序嵌入到Go程序中... Python和Go之间的交互必须经过C层。 - Nick Craig-Wood
2
为了在Go和Python进程之间进行通信,您可以在不同的进程中运行Python程序,并使用stdin、stdout来进行进程间通信(包os/exec)。对于此,JSON比XMLRPC更好,因为目前在Go中使用XML比JSON更难。 - Matt
2
现在使用Go 1.5已经成为可能了 - 请查看https://github.com/jbuberel/buildmodeshared以获取可工作的示例。 - Jason Buberel
显示剩余2条评论

4

我编写了一个扩展程序,可以让您编写与go交互的cpython扩展,它是setuptools的一部分: https://github.com/asottile/setuptools-golang

这里有几个示例扩展:

这些东西可以像其他pip包一样安装,并支持cpython和pypy。 PEP 513 manylinux1轮也可以通过setuptools-golang-build-manylinux-wheels工具构建,提供预构建的轮。
该方法与@ColonelPanic的答案几乎相同,但使用了一些额外的技巧来实现python2 + python3兼容性。

2

有一个名为go-python的包,专门帮助您在Go中编写Python扩展:

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


11
根据我所读的,go-python 可以帮助你从 Go 中调用 Python,而不是相反。 - zneak
1
这正是我所看到的,但被丢弃了,正如@zneak所说的那样完全相反。 - tehwalrus
1
我直接从go-python的自述文件中添加了一句引用,其中解释了如何使用它来构建Python扩展。 - uriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接