Cómo usar Cython para comstackr Python 3 en C

Estoy intentando convertir un script de Python 3 en C y luego comstackr ese archivo C en un ejecutable.

Tengo este simple script en python:

def greet(name = ""): print("Hello {0}".format(name if len(name) > 0 else "World")) greet("Mango") 

He convertido este script en C usando:

 cython greet.py -o greet.c 

Luego he comstackdo el archivo C usando:

 cc greet.c -o greet 

Después de ingresar el último comando recibí el error:

error grave: Python.h: No se ha finalizado la comstackción de ese archivo o directorio.

Después de que recibí el error, volví y me di cuenta de que estaba usando Python3 y que había olvidado el “3” después de “cython”.
Así que vuelva a comstackr el script de python usando:

 cython3 greet.py -o greet.c 

Luego intentó volver a comstackr el archivo C usando:

 cc greet.c -o greet 

Nuevamente, esto falló y lanzó el mismo error, así que fui a buscar a SO y Google y encontré estas preguntas:

  • error fatal: Python.h: No existe tal archivo o directorio
  • Tengo Python en mi sistema Ubuntu, pero gcc no puede encontrar Python.h
  • https://askubuntu.com/questions/526708/fatal-error-python-h-no-file-or-directory

Ninguna de estas respuestas en estas preguntas funciona.

Me aseguré de que instalé Cython todas las dependencias correctas usando apt-get install y pip install lamentablemente todavía no funciona.

Consulte la documentación. No es suficiente hacer gcc xc -ox .

Esta página explica la comstackción: http://docs.cython.org/src/reference/comstacktion.html

Hay mucho más que eso, pero una respuesta directa es:

La comstackción de sus archivos .c variará dependiendo de su sistema operativo. La documentación de Python para escribir módulos de extensión debe tener algunos detalles para su sistema. Aquí damos un ejemplo en un sistema Linux:

$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I / usr / include / python2.7 -o yourmod.so yourmod.c

Por supuesto, en su situación será algo más cercano a -I/usr/include/python3.4 , o incluso $(pkg-config --libs --cflags python3) . Y no estás construyendo con -shared , porque quieres un ejecutable.

El conjunto de comandos más corto “esto tiene que funcionar” es:

 cython3 --embed greet.py -o greet.c gcc $(pkg-config --libs --cflags python3) greet.c -o greet 

Necesitas instalar pkg-config si falta.

Como la respuesta de @ viraptor le muestra y según mi comentario, su principal problema es que necesita decirle a su comstackdor de C (por ejemplo, gcc ) dónde encontrar los encabezados de python requeridos ( pyconfig.h y Python.h ). Para hacer esto, necesitas pasar una opción -I a gcc .

La otra respuesta sugiere usar pkg-config para agregar esto a su línea de comandos. Sin embargo, al igual que usted, con las instalaciones de Ubuntu 14.04, cython3 y python3-dev , el uso de este método hace que el progtwig comstackdo salga con una falla de segmentación para mí.

Por lo tanto, te sugiero que vuelvas a lo básico. Después

 cython greet.py -o greet.c 

Ejecute el siguiente comando. Se supone que Python.h y sus amigos están en el lugar estándar (es decir, que ha realizado una instalación estándar de python3-dev )

 gcc -I/usr/include/python3.4m -o greet greet.c -lpython3.4m 

Si eso no funciona, use find / -iname Python.h para encontrar la ubicación de los archivos necesarios y modifique la ruta -I consecuencia.

Con el tiempo, cuando desee utilizar cython en progtwigs más complejos, como los que se vinculan con otras bibliotecas de C, deberá conocer las otras opciones que necesita pasar a gcc para comstackrlo y vincularlo correctamente. Para comenzar, sin embargo, lo anterior debería funcionar (probado en Ubuntu 14.04 según sus especificaciones)

PD: No estoy seguro de por qué la sugerencia pkg-config no funciona, pero para mí, parece agregar una ruta adicional a -I que rompe las cosas.