2012-09-15 13 views
42

Actualmente uso Cython para vincular C y Python, y obtengo aceleración en bits lentos de código python. Sin embargo, me gustaría usar goroutines para implementar un bit de código realmente lento (y muy paralelo), pero debe ser ejecutable desde python. (Ya he visto this question)Escribiendo una extensión de Python en Go (Golang)

Estoy (algo así como) 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 una corrección de errores/punto de vista de evitación

¿Cuál es la forma más simple de hacer esto sin tener que reinventar ninguna rueda?

Respuesta

33

Actualización 2015: como sea posible de Go 1,5 https://blog.filippo.io/building-python-modules-with-go-1-5/

con Go 1.5 se puede construir objetos y .so importarlos como módulos de Python, la ejecución de código Go (en lugar de C) directamente desde Python.

+0

esto es * impresionante *, gracias por publicarlo. – tehwalrus

+2

El proyecto github.com/go-python/gopy lo hace absurdamente fácil, creando todas las tuberías necesarias para usted que menciona la publicación del blog. –

+2

https://github.com/go-python/gopy – nemo

10

Lamentablemente, esto no es posible en la actualidad. Go puede ejecutar el código C (y ese código C puede volver a llamar a Go), pero el main function has to be in Go, por lo que el tiempo de ejecución Go puede configurarse.

+1

¿Quizás sea posible llamar a un proceso separado a través de xmlrpc? – jsbueno

+1

Gracias, esto prácticamente pone la idea en la cama. La única forma de hacer esto, entonces, sería usar algo como 'python_part_1 | go_program | python_part_2' usando pipes (o archivos intermedios, o XMLRPC) para pasar datos? – tehwalrus

+2

Puede usar conectores para hacer RPC. –

3

Hay un paquete go-python precisamente para ayudarle a escribir extensiones de Python en Ir:

este paquete proporciona un ejecutable "go-pitón", que acaba de carga "pitón" y luego llamar python.Py_Main (OS .Args). el ser racional que bajo un ejecutable por ejemplo, ir extensiones basadas en C-Python sería ser más fácil de poner en práctica (ya que esto generalmente significa poner en marcha a partir de C través de algunas de las funciones más complicadas lúpulo)

+9

Según lo que leí, 'go-python' te ayuda a invocar Python desde Go, y no al revés. – zneak

+1

Esto es lo que había visto y desechado, precisamente porque era al revés, como lo dijo @zneak. – tehwalrus

+1

Agregué una cita directamente del archivo léxico de Go-Python que explica cómo usarlo para construir extensiones de Python. – uriel

1

He escrito una extensión a setuptools que le permite escribir extensiones de CPython que la interfaz a la cita: https://github.com/asottile/setuptools-golang

hay un par de ejemplos de extensiones aquí:

The clean thi ng es que estos se pueden instalar como cualquier otro paquete pip y son compatibles con cpython y pypy.

PEP 513 Las ruedas manylinux1 también se pueden fabricar 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 de python2 + python3.