108 votes

Est-il possible de compiler une application python en binaire statique?

Ce que j'essaie de faire est d'expédier mon code sur un serveur distant, qui peut avoir différentes version de python installée et/ou peut ne pas avoir les packages de mon application l'exige.

Droit maintenant de parvenir à une telle portabilité-je construire amovibles virtualenv avec l'interprète et le code. Cette approche a des problèmes (par exemple, vous devez copier manuellement un tas de bibliothèques dans votre virtualenv, depuis --always-copy ne fonctionne pas comme prévu) et généralement lente.

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

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

144voto

R. S. Nikhil Krishna Points 2254

Il ya deux façons vous pouvez aller sur la façon de résoudre votre problème

  1. Utiliser un constructeur statique, comme le gel, ou pyinstaller, ou py2exe
  2. Compiler à l'aide de cython

Je vais vous expliquer comment vous pouvez le faire à l'aide de la seconde, depuis la première méthode n'est pas de la croix-plate-forme et la version, et a été expliqué dans d'autres réponses. Aussi, à l'aide de programmes comme pyinstaller en général, les résultats en grand les tailles de fichiers, où que l'utilisation de cython sera le résultat dans un fichier KBs en taille

Tout d'abord, installez cython. Ensuite, renommez votre fichier python (dire test.py) dans un fichier de custode

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

Ensuite, vous pouvez utiliser cython avec GCC compiler (Cython génère un fichier C de Python .custode fichier, puis GCC compile le fichier C) (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 pourriez avoir à modifier la dernière commande. Pour connaître la version de python que vous utilisez, il suffit d'utiliser

$ python -V

Vous avez maintenant un fichier binaire "test", qui est ce que vous cherchez

REMARQUE: Cython est utilisé pour une utilisation de Type C les définitions de Variables statiques de l'allocation de mémoire pour accélérer les programmes Python. Dans votre cas, cependant, vous serez toujours à l'aide du traditionnel Python définitions.

NOTE2: Si vous utilisez des bibliothèques supplémentaires (comme opencv, par exemple), vous pourriez avoir à fournir le répertoire à l'aide de -L puis spécifiez le nom de la bibliothèque à l'aide de -l dans le CCAG Drapeaux. Pour plus d'informations, reportez-vous à la GCC drapeaux

12voto

Prakhar Agarwal Points 1374

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

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

2voto

asc11 Points 139

Vous cherchez probablement quelque chose comme Freeze, 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

0voto

iScrE4m Points 749

Gel options:

Cependant, votre serveur cible doit avoir l'environnement que vous voulez -> vous devriez être en mesure de "créer". Si cela ne fonctionne pas, vous devez construire votre logiciel pour correspondre à l'environnement.

J'ai trouvé ce guide pratique sur la façon d'installer une version personnalisée de python pour un virtualenv, en supposant que vous avez un accès ssh: https://stackoverflow.com/a/5507373/5616110

Dans le virtualenv, vous devriez être en mesure de pip installer quoi que ce soit et vous ne devriez pas avoir à vous soucier des privilèges sudo. Bien sûr, le fait de les avoir et de l'accès au gestionnaire de paquets comme apt rend tout beaucoup plus facile.

0voto

Boud Points 3941

Pour figer votre exécutable python et de l'expédier au long de votre code, l'incorporer dans une coquille vide app. Suivez les instructions sur la manière d'intégrer python dans une application à partir de la documentation officielle. Vous pouvez commencer à construire un exemple d'application directement à partir de la C exemple de code qu'ils donnent sur la page web.

Faire que le programme de l'exécution de votre application python par le biais de l'utilisation intégrée de python. Navire le programme, le python intégré vous utilisé et votre programme en python. Exécuter ce programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X