我目前使用Cython链接C和Python,并在慢速的python代码中获得加速。但是,我想使用goroutine来实现一个非常慢(并且非常可并行化)的代码,但它必须可以从python中调用。 (我已经看过this question)
我(有点)很高兴通过C(或Cython)来设置数据结构等,如果有必要,但从错误修复/避免的角度来看,避免这个额外的层会很好。
在不重新发明轮子的情况下,最简单的方法是什么?
答案 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兼容性。