Al contrario de lo que afirman Adam Matan y otros, de hecho puede crear un solo archivo binario ejecutable usando Cython, a partir de un archivo Python (.py) puro.
Sí, Cython está diseñado para usarse como se indica, como una forma de simplificar la escritura de módulos de extensión C / C ++ para el tiempo de ejecución de CPython python.
Pero, como nudzo alude en este comentario , puede usar el --embed
interruptor en la línea de comandos.
He aquí un ejemplo extremadamente sencillo. Estoy realizando esto desde una estación de trabajo Debian Sid, usando python3 y cython3 ..
Asegúrese de tener los paquetes python-dev o python3-dev instalados de antemano.
1) Cree un programa Python muy simple llamado hello.py
$ gato hello.py
print ("¡Hola mundo!")
2) Utilice Cython para compilar su programa Python en C ...
cython3 --embed -o hello.c hello.py
3) Utilice 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 ...
$ file hola
hola: ejecutable LSB ELF de 64 bits, x86-64, versión 1 (SYSV), vinculado dinámicamente (usa 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, con este método, básicamente puede usar Cython para convertir sus aplicaciones Python puras en código objeto compilado y ejecutable.
Estoy usando este método para aplicaciones mucho más complejas, por ejemplo, una aplicación Python / PySide / Qt completa.
Para diferentes versiones de Python, usted adapta el gcc -I
y los -l
conmutadores para que se adapten.
Luego puede empaquetar el 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 debería poder ejecutarse incluso después de una actualización de distribución al mismo versiones de Python, etc. en esa distribución.