Escribir una extensión de Python en Go (Golang)


Actualmente uso Cython para vincular C y Python, y obtener aceleración en bits lentos de código python. Sin embargo, me gustaría usar goroutines para implementar un bit de código muy lento (y muy paralelizable), pero debe ser llamable desde python. (Ya he visto esta pregunta)

Estoy (algo así) feliz de ir a través de C (o Cython) para configurar estructuras de datos, etc. si es necesario, pero evitar esta capa adicional sería bueno desde el punto de vista de corrección de errores/evitación.

¿ Qué es lo más simple manera de hacer esto sin tener que reinventar ruedas?

Author: Community, 2012-09-16

4 answers

Actualización 2015 : posible a partir de Go 1.5 https://blog.filippo.io/building-python-modules-with-go-1-5 /

Con Go 1.5 puede compilar objetos .so e importarlos como módulos Python, ejecutando código Go (en lugar de C) directamente desde Python.

 35
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-27 21:29:39

Desafortunadamente, esto no es posible actualmente. Go puede ejecutar código C (y ese código C puede volver a llamar a Go), pero el main la función tiene que estar en Go, por lo que el tiempo de ejecución de Go puede configurar las cosas.

 10
Author: Russ Amos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-16 01:39:45

Hay un paquete go-python precisamente para ayudarlo a escribir extensiones de Python en Go:

Este paquete proporciona un ejecutable "go-python" que solo carga "python" y luego llamar a python. Py_Main( os. Args). el ser racional que bajo tal ejecutable, las extensiones basadas en go para C-Python ser más fácil de implementar (ya que esto generalmente significa llamar a go desde C a través de algunas funciones bastante enrevesadas saltos)

 3
Author: uriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-19 21:36:14

He escrito una extensión para setuptools que te permite escribir extensiones de cpython que interactúan con go: https://github.com/asottile/setuptools-golang

Hay un par de extensiones de ejemplo aquí:

Lo bueno es que se pueden instalar como cualquier otro paquete pip y son compatibles con cpython y pypy.

PEP 513 las ruedas manylinux1 también se pueden construir para proporcionar ruedas preconstruidas a través de la herramienta setuptools-golang-build-manylinux-wheels.

El enfoque es casi idéntico al de la respuesta de @ColonelPanic, pero utiliza algunos trucos adicionales para habilitar la compatibilidad con python2 + python3.

 1
Author: Anthony Sottile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-01 05:52:20