在Go(Golang)中编写Python扩展

时间:2012-09-15 23:19:32

标签: python c go cython

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

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

在不重新发明轮子的情况下,最简单的方法是什么?

4 个答案:

答案 0 :(得分:38)

更新2015 :从Go 1.5 https://blog.filippo.io/building-python-modules-with-go-1-5/

开始
  

使用Go 1.5,您可以构建.so对象并将它们作为Python模块导入,直接从Python运行Go代码(而不是C)。

答案 1 :(得分:10)

不幸的是,这目前无法实现。 Go可以运行C代码(然后C代码可以回调到Go),但main function has to be in Go,所以Go运行时可以设置。

答案 2 :(得分:3)

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

  

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

答案 3 :(得分:1)

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

接口的cpython扩展。

这里有几个示例扩展:

巧妙的是,这些可以像任何其他pip包一样安装,并支持cpython和pypy。

也可以构建

PEP 513 manylinux1车轮,通过setuptools-golang-build-manylinux-wheels工具提供预制车轮。

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