python packages cython executable

python - Haciendo un ejecutable en cython



packages executable (2)

Estado jugando con cython Normalmente se programa en Python, pero usa C en una vida anterior. No puedo averiguar cómo hacer un ejecutable independiente.

Descargué cython y puedo crear un archivo .pyx (que es solo un archivo normal de Python con una extensión .pyx), que se ejecuta en el shell de Python, usando: import pyximport; pyximport.install ()

Puedo generar un archivo .c en la línea de comandos con: cython file.pyx Puedo generar un archivo .so construyendo un archivo setup.py estándar y ejecutando:

setup.py build_ext --inplace

He intentado hacer un archivo ejecutable del archivo .so usando gcc con varias opciones, pero siempre tengo toneladas de archivos, encabezados, etc. faltantes. He intentado apuntar a encabezados desde prácticamente cualquier lugar, pero sin éxito, y no estoy realmente familiarizado. con lo que hacen todas las opciones de gcc, o incluso si debería usar gcc.

He tenido una desconexión aquí con el hecho de que puedo ejecutar mi programa en el shell de Python, pero no en la línea de comandos (no quiero que los usuarios tengan que ingresar al shell, importar módulos, etc.).

¿Que me estoy perdiendo aqui?


Lo que quieres es la bandera --embed para el compilador Cython. No hay un montón de documentación, pero this es lo que pude encontrar. Se vincula a un ejemplo de trabajo simple.

Para compilar el código fuente de Cython en un archivo C que luego puede compilarse en un ejecutable, use un comando como cython myfile.pyx --embed y luego compile con cualquier compilador de C que esté usando.

Cuando compile el código fuente de C, aún necesitará incluir el directorio con los encabezados de Python y un enlace a la biblioteca compartida de Python correspondiente en su sistema (un archivo llamado algo así como libpython27.so o libpython27.a si está usando Python 2.7 ).

Edición: aquí hay algunas instrucciones más sobre cómo obtener los comandos para incluir los encabezados adecuados y vincularlos con las bibliotecas adecuadas.

Como dije antes, necesitas ejecutar el compilador Cython de esta manera:

cython <cython_file> --embed

Para compilar usando gcc, deberás encontrar dónde están los encabezados de python en tu sistema (puedes obtener esta ubicación ejecutando distutils.sysconfig.get_python_inc() (tendrás que importarlo primero). Probablemente sea solo el /include subdirectorio en tu directorio de instalación de Python.

También tendrás que encontrar la biblioteca compartida de python. Para Python 2.7 sería libpython27.a en Windows o libpython2.7.so en Linux.

Tu comando gcc será entonces

gcc <C_file_from_cython> -I<include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>

Puede ser sabio incluir la bandera -fPIC . En las máquinas con Windows de 64 bits, también deberá incluir las banderas -D MS_WIN64 que le indican a mingw que compile las ventanas de 64 bits.

Si está compilando algo que depende de NumPy, también deberá incluir el directorio que contiene los encabezados de NumPy. Puede encontrar esta carpeta ejecutando numpy.get_include() (nuevamente, después de importar numpy). Tu comando gcc entonces se convierte en

gcc <C_file_from_cython> -I<include_directory> -I<numpy_include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>

Esta guide opciones de comando gcc puede ser útil.

Además, te recomendaría que uses las vistas de memoria de Cython si es posible. Eso lo hará para que no tengas que incluir los encabezados NumPy e incluir el archivo NumPy pxd en tu archivo Cython. También facilita las operaciones de segmentación para que el compilador de C optimice.


Probado esto en Ubuntu:

Instala Cython usando lo siguiente (Python 2):

sudo apt-get install cython

Para Python 3:

sudo apt-get install cython3

Para compilar el código de Python en una ejecución de código C (cambie cython a cython3 para Python 3):

cython --embed -o example.c example.py

Esto generará el archivo example.c .

Ahora compile el archivo example.c :

gcc -Os -I /usr/include/python2.7 example.c -lpython2.7 -o example

Ejecuta el archivo:

./example

Ahora para Python 3, algo como esto funcionará (no probado):

gcc -Os -I /usr/include/python3.6 example.c -lpython3.6 -o example

donde python3.x es la versión de Python instalada en su máquina.