Compiler le programme Python principal en utilisant Cython

j'ai un Python2.6 programme qui peut charger des modules Python compilés .donc des fichiers utilisant Cython. J'ai utilisé Cython pour compiler le .PY modules to .donc les dossiers et tout fonctionne bien.

C'est le setup.py fichier 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
)

donc je sais que je peux compiler des modules Python en utilisant Cython (je suppose que Cython crée des fichiers " C " à partir de mes fichiers Python et les compile ensuite), mais puis-je compiler mon programme Python principal à quelque chose que je peux exécuter sur une plate-forme Linux? Si c'est le cas, un exemple de ligne de commande Cython serait apprécié. Grâce.

57
demandé sur mozza 2011-02-24 16:48:32

4 réponses

contrairement à ce qu'Adam Matan et d'autres affirment, vous can en fait créer un seul fichier binaire exécutable en utilisant Cython, à partir d'un Python pur (.PY) file.

Oui, Cython est destiné à être utilisé comme indiqué - comme un moyen de simplifier l'écriture de modules d'extension C/C++ pour L'exécution de Python python.

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

voici un exemple extrêmement simple. J'utilise python3 et cython3 à partir d'une station de travail Debian Sid..

assurez-vous d'avoir les paquets python-dev ou python3-dev installés à l'avance.

1) créer un programme Python très simple appelé hello.py

$ cat hello.py

print ("Hello World!")

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

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

4) vous Vous retrouvez avec un dossier intitulé hello ...

$ fichier bonjour

hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (utilise des libs partagées), pour GNU/Linux 2.6.32, BuildID[sha1]=006f45195a26f1949c6ed051df9cbd4433e1ac23, Non stripped

$ 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 dynamiquement lié à Python 3.3 sur mon système Debian.

5) exécuter bonjour ...

$ ./ hello

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

pour différentes versions de Python, vous adaptez les commutateurs gcc -I et -l pour convenir.

vous pouvez alors empaqueter l'exécutable comme une distribution (.deb, etc.), sans avoir à empaqueter les fichiers Python/PySide/Qt - l'avantage étant que votre application devrait toujours être capable de tourner même après une mise à jour de la distribution vers les mêmes versions de Python, etc. sur cette distribution.

110
répondu Broken Man 2017-05-23 12:18:25

regardez les réponses à Cython peut-il compiler vers un EXE? qui, contrairement à toutes les autres réponses ici de dire que, oui, il est possible de compiler un exécutable.

les liens sur Embedding Cython semblent être un bon point de départ, mais ce N'est pas le but premier de Cython, donc je ne sais pas si ce serait simple.

16
répondu Scott Griffiths 2017-05-23 12:26:38

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

3
répondu Jake Cook 2015-12-14 14:02:43

vous ne pouvez pas, Cython n'est pas fait pour compiler Python ni pour le transformer en un exécutable.

pour produire un .fichier exe, utilisez py2exe .

pour produire un paquet pour Mac ou Linux, utilisez le processus du système d'empaquetage regulard car il n'y a rien de spécifique dans un programme de langage de script dans Unix env.

-13
répondu e-satis 2011-02-24 14:06:46