web-dev-qa-db-fra.com

Compiler le programme principal Python en utilisant Cython

J'ai un programme Python2.6 qui peut charger Python compilés en fichiers .so en utilisant Cython. J'ai utilisé Cython pour compiler les modules .py en fichiers .so et tout fonctionne bien.

Voici le fichier setup.py que j'utilise avec 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
)

Je sais donc que je peux compiler Python en utilisant Cython (je suppose que Cython crée des fichiers 'C' à partir de mes fichiers Python puis les compile), mais puis-je compiler mon programme principal Python en quelque chose que je peux exécuter sur une plate-forme Linux? Si oui, un exemple de ligne de commande Cython serait apprécié. Merci.

71
mozza

Contrairement à ce qu'affirment Adam Matan et d'autres, vous pouvez créez en fait un seul fichier binaire exécutable à l'aide de Cython, à partir de un fichier Python (.py) pur.

Oui, Cython est destiné à être utilisé comme indiqué - comme un moyen de simplifier l'écriture des modules d'extension C/C++ pour le runtime CPython python.

Mais, comme le fait allusion nudzo dans ce commentaire , vous pouvez utiliser le --embed passer à l'invite de ligne de commande.

Voici un exemple extrêmement simple. Je le fais depuis un poste de travail Debian Sid, en utilisant python3 et cython3 ..

Assurez-vous d'avoir python-dev ou python3-dev packages installés au préalable .

1) Créez un programme Python) très simple appelé hello.py

$ cat hello.py

imprimer ("Bonjour tout le monde!")

2) Utilisez Cython pour compiler votre programme python en C ...

cython3 --embed -o hello.c hello.py

3) Utilisez GCC pour compiler hello.c dans un fichier exécutable appelé hello ...

gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl

4) Vous vous retrouvez avec un fichier appelé bonjour ...

$ file bonjour

bonjour: exécutable ELF 64 bits LSB, x86-64, version 1 (SYSV), lié dynamiquement (utilise des bibliothèques partagées), pour GNU/Linux 2.6.32, BuildID [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23, non supprimé

$ 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)

Dans ce cas, l'exécutable est lié dynamiquement à Python 3.3 sur mon système Debian.

5) exécuter bonjour ...

$ ./bonjour

Bonjour le monde!

Comme vous pouvez le voir, en utilisant cette méthode, vous pouvez essentiellement utiliser Cython pour convertir vos applications Python pures en code objet compilé exécutable).

J'utilise cette méthode pour des applications beaucoup plus complexes - par exemple, une application Python/PySide/Qt complète.

Pour différentes versions de Python, vous personnalisez le gcc -I et -l change pour convenir.

Vous pouvez ensuite empaqueter l'exécutable sous forme de fichier de distribution (.deb, etc.), sans avoir à empaqueter les fichiers Python/PySide/Qt - l'avantage étant que votre application devrait toujours pouvoir s'exécuter même après une mise à jour de distribution vers le même versions de Python, etc. sur cette distribution.

140
Broken Man

Jetez un oeil aux réponses à Cython peut-il compiler en EXE? qui, contrairement à toutes les autres réponses ici, dit que oui, il est possible de compiler en un exécutable.

Les liens à Embedding Cython semblent être un bon point de départ, mais ce n'est pas le but principal de Cython, donc je ne sais pas si ce serait simple.

17
Scott Griffiths

Je ne sais pas si cela vous aidera ou non, mais Nudzo a raison. Vous pouvez l'obtenir avec cython --embed -o main.o main.py puis j'essaye de compiler le résultat avec cl/EHsc

3
Jake Cook