Créer un exécutable à Cython

J'ai joué avec cython. Normalement programme en Python, mais utilisé C dans une vie antérieure. Je ne peux pas comprendre comment faire un exécutable.

j'ai téléchargé cython, et je peux faire un .pyx (c'est juste un fichier Python normal avec un .pyx extension), qui s'exécute dans le shell Python, en utilisant: import pyximport; pyximport.installer()

je peux générer un .c fichier en ligne de commande avec: cython fichier.custode Je peux générer un .fichier so par construction d'un standard setup.py et de l'exécution:

setup.py build_ext --inplace

j'ai essayé de faire un exécutable à partir de la .donc Fichier utilisant gcc avec diverses options, mais ont toujours des tonnes de fichiers manquants, en-têtes, etc J'ai essayé de pointer vers des en-têtes de presque partout, mais sans succès, et je ne suis pas vraiment familier avec ce que font toutes les options de gcc, ou même si je devrais utiliser gcc.

j'ai une déconnexion ici avec le fait que je peux exécuter mon programme dans l'interpréteur de commandes Python, mais pas à la commande line, (Je ne veux pas que les utilisateurs aient à entrer dans le shell, importer des modules, etc.).

Qu'est-ce que je rate ici?

19
demandé sur denfromufa 2014-03-19 17:35:16

2 réponses

Ce que vous voulez, c'est le --embed drapeau pour le compilateur Cython. Il n'y a pas une tonne de documentation dessus, mais est ce que j'ai pu trouver. Il est lié à un exemple simple de travail.

pour compiler le code source Cython dans un fichier C qui peut ensuite être compilé dans un exécutable, vous utilisez une commande comme cython myfile.pyx --embed puis compilez avec le compilateur C que vous utilisez.

lorsque vous compilez le code source C, vous devrez tout de même inclure répertoire avec les en-têtes Python et lien vers la bibliothèque partagée Python correspondante sur votre système (un fichier nommé quelque chose comme libpython27.so ou libpython27.a si vous utilisez Python 2.7).

Edit: Voici d'autres instructions sur la façon d'obtenir les commandes pour inclure les en-têtes appropriés et les liens avec les bibliothèques appropriées.

comme je l'ai dit plus tôt, vous devez exécuter le compilateur Cython comme ceci:

cython <cython_file> --embed

pour compiler en utilisant gcc, vous vous aurez besoin de trouver où sont les en-têtes python sur votre système (vous pouvez obtenir cet emplacement en exécutant distutils.sysconfig.get_python_inc() (vous devez l'importer). Il est probablement juste de l' /include sous-répertoire de votre répertoire d'installation Python.

vous devrez également trouver la bibliothèque partagée python. Pour Python 2.7 ce serait libpython27.a sur Windows ou libpython2.7.so sur Linux.

votre commande gcc sera alors

gcc <C_file_from_cython> -I<include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>

Il peut être sage d'inclure l' -fPIC drapeau. Sur Windows 64 bit machines vous devrez également inclure les drapeaux -D MS_WIN64 qui dit à mingw de compiler pour des fenêtres 64 bits.

si vous compilez quelque chose qui dépend de NumPy, vous devrez aussi inclure le répertoire contenant les en-têtes de NumPy. Vous pouvez trouver ce dossier en exécutant numpy.get_include() (encore une fois, après l'importation de numpy). Votre commande gcc devient alors

gcc <C_file_from_cython> -I<include_directory> -I<numpy_include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>

cette option de commande gcc guide peut être utile.

Aussi, I je vous recommande D'utiliser les vues mémoire de Cython si possible. Cela fera en sorte que vous n'aurez pas à inclure les en-têtes NumPy et inclure le fichier NumPy pxd dans votre fichier Cython. Cela rend également les opérations de tranchage plus faciles à optimiser pour le compilateur C.

24
répondu IanH 2014-03-19 22:30:59

Testé sur Ubuntu:

Installer Cython à l'aide de la suite (Python 2):

sudo apt-get install cython

Pour Python 3:

sudo apt-get install cython3

pour compiler le code Python dans un code C lancer (modifier cythoncython3 pour Python 3):

cython --embed -o example.c example.py

cela générera le example.c fichier.

compilez maintenant le example.c fichier:

gcc -Os -I /usr/include/python2.7 example.c -lpython2.7 -o example

Exécuter le fichier:

./example

maintenant pour Python 3, quelque chose comme ceci va travail (non testé):

gcc -Os -I /usr/include/python3.6 example.c -lpython3.6 -o example

python3.x est la version de Python installée sur votre machine.

1
répondu Rafael 2018-08-05 17:21:18