web-dev-qa-db-fra.com

Existe-t-il un moyen de compiler l’application python en binaire statique)?

Ce que j'essaie de faire, c'est d'envoyer mon code sur un serveur distant, qui peut avoir une version différente python installée et/ou peut ne pas avoir les packages requis par mon application).

À l'heure actuelle, pour atteindre cette portabilité, je dois créer un environnement virtuel déplaçable avec interpréteur et code. Cette approche a quelques problèmes (par exemple, vous devez copier manuellement un ensemble de bibliothèques dans votre virtualenv, puisque --always-copy _ ne fonctionne pas comme prévu) et généralement lent.

Il y a (en théorie) n moyen de construire python lui-même de manière statique.

Je me demande si je pourrais compiler interprète avec mon code dans un binaire et exécuter mon application en tant que module. Quelque chose comme ca: ./mypython -m myapp run ou ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application.

56
roboslone

Vous pouvez résoudre votre problème de deux manières.

  1. Utilisez un générateur statique, tel que freeze, ou pyinstaller, ou py2exe
  2. Compiler avec Cython

J'expliquerai comment vous pouvez vous y prendre en utilisant la deuxième méthode, car la première méthode n'est pas multiplateforme et version, et a été expliquée dans d'autres réponses. En outre, l'utilisation de programmes tels que pyinstaller entraîne généralement des tailles de fichier énormes, tandis que l'utilisation de cython donne un fichier de la taille d'un KB.

Commencez par installer Cython. Ensuite, renommez votre fichier python (par exemple, test.py) en un fichier pyx

$ Sudo pip install cython
$ mv test.py test.pyx

Ensuite, vous pouvez utiliser cython avec GCC pour le compiler (Cython génère un fichier C à partir d’un fichier Python .pyx, puis GCC le compile) (en référence à https: // stackoverflow.com/a/22040484/5714445 )

$ cython test.pyx --embed
$ gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl

REMARQUE: Selon votre version de python, vous devrez peut-être modifier la dernière commande. Pour savoir quelle version de python vous utilisez, utilisez simplement

$ python -V

Vous allez maintenant avoir un "test" de fichier binaire, ce que vous cherchez

REMARQUE: Cython utilise habituellement les définitions de variable de type C pour l'allocation de mémoire statique afin d'accélérer les programmes Python. Cependant, dans votre cas, vous utiliserez toujours les définitions Python traditionnelles.

REMARQUE 2: Si vous utilisez des bibliothèques supplémentaires (comme opencv, par exemple), vous devrez peut-être leur fournir le répertoire à l'aide de -L, puis spécifier le nom de la bibliothèque à l'aide de -l dans les fanions GCC. Pour plus d'informations à ce sujet, reportez-vous à Drapeaux GCC.

68

Vous voudrez peut-être enquêter Nuitka . Cela prend python le code source et le convertit en appels API C++. Ensuite, il se compile en un exécutable binaire (ELF sur Linux). Il existe depuis quelques années et supporte une large gamme de Python.

Vous obtiendrez probablement également une amélioration des performances si vous l'utilisez. Conseillé.

5
Prakhar Agarwal

Pour figer votre exécutable python et l'intégrer à votre code, intégrez-le dans une application Shell vide. Suivez les instructions pour intégrer python dans une application du documentation officielle . Vous pouvez commencer à créer un exemple d'application directement à partir de l'exemple de code C indiqué sur la page Web.

Faites que ce programme exécute votre application python via le python incorporé. Envoyez le programme, le python que vous avez utilisé et votre python = programme: exécute ce programme.

0
Boud

Vous cherchez probablement quelque chose comme Freeze, qui est capable de compiler votre application Python avec toutes ses bibliothèques dans un binaire statique:

page PyPi de Freeze

page Wiki Python de Freeze

page Sourceforge de Freeze

0
asc11

Si vous êtes sur un Mac, vous pouvez utiliser py2app pour créer un bundle .app, qui lance votre Django lorsque vous double-cliquez dessus.

J'ai décrit comment intégrer Django et CherryPy dans un tel ensemble à l'adresse https://moosystems.com/articles/14-distribute-Django-app-as-native-desktop- app-01.html

Dans l'article, j'utilise pywebview pour afficher votre site Django dans une fenêtre d'application locale.

0
André Aulich

Options de gel:

Cependant, votre serveur cible doit disposer de l'environnement souhaité -> vous devriez pouvoir le "créer". Si ce n'est pas le cas, vous devez créer votre logiciel en fonction de l'environnement.

J'ai trouvé ce guide pratique sur l'installation de la version personnalisée de python sur virtualenv, en supposant que vous ayez un accès ssh: https://stackoverflow.com/a/5507373/561611

Dans virtualenv, vous devriez pouvoir installer n'importe quoi et ne pas avoir à vous soucier des privilèges de Sudo. Bien sûr, les avoir et avoir accès au gestionnaire de paquets comme apt rend tout beaucoup plus facile.

0
iScrE4m