簡體   English   中英

用 Go (Golang) 編寫 Python 擴展

[英]Writing a Python extension in Go (Golang)

我目前使用 Cython 來鏈接 C 和 Python,並在 Python 代碼的緩慢位中獲得加速。 但是,我想使用 goroutines 來實現一段非常緩慢(並且非常可並行化)的代碼,但它必須可以從 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 擴展模塊。

不幸的是,這目前是不可能的。 Go 可以運行 C 代碼(然后該 C 代碼可以回調到 Go 中),但是main函數必須在 Go 中,因此 Go 運行時可以進行設置。

我已經為 setuptools 編寫了一個擴展,它允許您編寫與 go 接口的 cpython 擴展: https : //github.com/asottile/setuptools-golang

這里有幾個示例擴展:

巧妙的是這些可以像任何其他pip包一樣安裝,並支持 cpython 和 pypy。

也可以通過setuptools-golang-build-manylinux-wheels工具setuptools-golang-build-manylinux-wheels PEP 513 manylinux1 輪子以提供預setuptools-golang-build-manylinux-wheels

該方法與@ColonelPanic 的答案中的方法幾乎相同,但使用了一些額外的技巧來啟用 python2 + python3 兼容性。

有一個go-python包正好可以幫助你在 Go 中編寫 Python 擴展:

這個包提供了一個可執行的“go-python”,它只加載“python”然后調用 python.Py_Main(os.Args)。 理由是在這樣的可執行文件下,基於 Go 的 C-Python 擴展將更容易實現(因為這通常意味着通過一些相當復雜的函數跳轉從 C 調用進入)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM