python - numba
Compila el programa principal de Python usando Cython (4)
Tengo un programa Python2.6 que puede cargar módulos de Python compilados en archivos .so usando Cython. Utilicé Cython para compilar los módulos .py en archivos .so y todo funciona bien.
Este es el archivo setup.py que uso con Cython:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("ldap", ["ldap.pyx"]),
Extension("checker", ["checker.pyx"]),
Extension("finder", ["finder.pyx"]),
Extension("utils", ["utils.pyx"]),
]
setup(
name = ''bchecker'',
cmdclass = {''build_ext'': build_ext},
ext_modules = ext_modules
)
Entonces sé que puedo compilar módulos de Python usando Cython (supongo que Cython crea archivos ''C'' de mis archivos de Python y luego los compila), pero ¿puedo compilar mi programa principal de Python para algo que pueda ejecutar en una plataforma Linux? Si es así, se agradecería un ejemplo de línea de comando de Cython. Gracias.
Al contrario de lo que afirman Adam Matan y otros, en realidad puedes crear un solo archivo binario ejecutable utilizando Cython, a partir de un archivo puro de Python (.py).
Sí, Cython está destinado a ser utilizado como se indica, como una forma de simplificar la escritura de módulos de extensión C / C ++ para el tiempo de ejecución python CPython.
Pero, como nudzo alude en este comment , puede usar el --embed
en el indicador de línea de comando.
Aquí hay un ejemplo extremadamente simple. Estoy trabajando en esto desde una estación de trabajo Debian Sid, usando python3 y cython3.
Asegúrese de tener paquetes python-dev o python3-dev instalados de antemano.
1) Crea un programa de Python muy simple llamado hello.py
$ cat hello.py
print ("¡Hola mundo!")
2) Utiliza Cython para compilar tu programa python en C ...
cython3 --embed -o hello.c hello.py
3) Use GCC para compilar hello.c en un archivo ejecutable llamado hello ...
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) Terminas con un archivo llamado hola ...
$ archivo hola
hola: ELF 64 bits LSB ejecutable, x86-64, versión 1 (SYSV), vinculado dinámicamente (utiliza bibliotecas compartidas), para GNU / Linux 2.6.32, BuildID [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23, no eliminado
$ ldd hello
linux-vdso.so.1 (0x00007fff273fe000)
libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)
En este caso, el ejecutable está vinculado dinámicamente a Python 3.3 en mi sistema Debian.
5) corre, hola ...
$ ./hello
Hola Mundo!
Como puede ver, al usar este método, básicamente puede usar Cython para convertir sus aplicaciones de Python puras en código objeto compilado ejecutable.
Estoy usando este método para aplicaciones mucho más complejas, por ejemplo, una aplicación completa de Python / PySide / Qt.
Para diferentes versiones de Python, -l
conmutadores gcc -I
y -l
a tu medida.
A continuación, puede empaquetar el archivo ejecutable como un archivo de distribución (.deb, etc.) sin tener que empaquetar los archivos Python / PySide / Qt; la ventaja es que su aplicación aún podrá ejecutarse incluso después de una actualización de distribución en el mismo versiones de Python, etc. en esa distribución.
Eche un vistazo a las respuestas de Can Cython a la compilación de un EXE? que, contrariamente a todas las otras respuestas aquí dicen que sí, es posible compilar a un ejecutable.
Los enlaces en Embedding Cython parecen ser un buen lugar para comenzar, pero no es el objetivo principal de Cython, así que no sé cuán sencillo sería.
No sé si esto ayudará o no, pero Nudzo está en lo correcto. Puedes obtenerlo con cython --embed -o main.o main.py
y luego trato de compilar el resultado con cl / EHsc
No se puede, Cython no está hecho para compilar Python ni para convertirlo en un ejecutable.
Para producir un archivo .exe, use py2exe .
Para producir un paquete para Mac o Linux, use el proceso del sistema de empaquetamiento regulard ya que no hay nada específico acerca de un programa de lenguaje de scripts en env de Unix.