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.
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.
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.
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