Comment rendre un exécutable de script Python autonome à exécuter sans aucune dépendance?

707

Je crée une application Python et je ne veux pas forcer mes clients à installer Python et des modules.

Alors, existe-t-il un moyen de compiler un script Python pour être un exécutable autonome?

Jeff
la source
307
La partie de la question qui dit "Je ne veux pas forcer mes clients à installer Python et des modules." Cela ne dit pas que les clients ne peuvent pas le faire, cela dit que le développeur ne veut pas les obliger à le faire. Il est inutile de débattre de ce point ici, car les clients ne lisent pas SO pour parler d'eux-mêmes. Je ne voudrais pas installer un environnement de développement Flash juste pour regarder youtube, ou un environnement de développement C juste pour jouer à Sudoku, ou un environnement de développement Python pour exécuter une version d'Angry Birds écrite en Python. C'est à cela que servent les temps d'exécution redistribuables.
Dave

Réponses:

243

Vous pouvez utiliser py2exe comme déjà répondu et utiliser cython pour convertir vos .pyfichiers clés en fichiers .pycC compilés, comme .dlldans Windows et .soLinux, beaucoup plus difficiles à rétablir que les fichiers communs .pyoet .pyc(et aussi gagner en performances!)

neurino
la source
1
Merci de répondre. J'ai considéré Cython, mais il semble qu'il ait toujours besoin de Python pour exécuter l'exécutable compilé. Voulez-vous dire la compilation de scripts en .pyc en utilisant Cython? (Je ne savais pas si Cython avait une telle fonctionnalité)
Jeff
9
Je veux dire que vous avez deux problèmes : la source fermée et le no-deps. Pour les sources fermées, compilez votre code important dans des bibliothèques C en utilisant Cython. Pour les no-deps, utilisez py2exe et créez un exécutable avec des fichiers .pyd (compilés par cython) dans.
neurino
7
Que feriez-vous des bibliothèques (numpy, scipy, matplotlib)? Par exemple, comment les clients pourraient-ils utiliser la fonction ginput () dans matplotlib depuis l'exécutable, sans l'avoir installée sur leur ordinateur.
chimpsarehungry
@chimpsarehungry qu'en est-il des liens statiques?
Braden Best
11
La dernière version semble être en 2008, est-ce toujours le cas?
Zitrax
302

Vous pouvez utiliser PyInstaller pour empaqueter des programmes Python en tant qu'exécutables autonomes. Il fonctionne sur Windows, Linux et Mac.

Démarrage rapide de PyInstaller

Installez PyInstaller à partir de PyPI:

pip install pyinstaller

Accédez au répertoire de votre programme et exécutez:

pyinstaller yourprogram.py

Cela générera le bundle dans un sous-répertoire appelé dist.

Pour une procédure plus détaillée, consultez le manuel .

Rumple Stiltskin
la source
10
Il convient de noter que pyinstaller peut être compilé dans un seul fichier .exe. Aussi sur quel OS il est exécuté, rend cet exécutable, c'est-à-dire .exe lorsqu'il est exécuté sur Windows
Richard de Wit
2
@ ItayMoav-Malimovka Ils travaillent dans le support de Python 3. Voir github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS
3
Comme l'a dit @GeenHenk, si vous "compilez" sur Windows, cela crée un exe, gardez à l'esprit que vous ne pouvez pas compiler pour Windows (faire un exe) sur Linux, ou faire un exécutable Linux sur Windows. Vous ne pouvez créer que l'exécutable de la plateforme que vous utilisez. (Sous Linux, vous pouvez utiliser wine pour tromper cela)
PhoneixS
14
utiliser 'pyinstaller' est bien plus simple que 'py2exe'. Il prend en charge toutes les dépendances, y compris numpy, pandas, n'importe quoi et vous donne un seul exécutable sur la plate-forme de travail!
AKS
12
Semble exactement ce que je cherchais. Et prend désormais en charge Python 3! Merci :)
Daniel Gruszczyk
83

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

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

cdarke
la source
5
Nuitka est un outil génial. Pas besoin de ne pas l'utiliser. Je voudrais seulement souligner une chose - ce n'est pas limité à Linux uniquement - c'est multiplateforme - une autre raison pour laquelle l'utiliser.
sjaustirni
5
Nuitka fonctionne sur Python 2.6, 2.7, 3.2, 3.3 et 3.4 et est multiplateforme: (Linux, FreeBSD, NetBSD, MacOS X et Windows (32/64 bits). D'autres peuvent également fonctionner. Architectures: x86, x86_64 (amd64) et arm. D'autres architectures peuvent également fonctionner, hors de la boîte.)
Jonathan Hartley
Il n'est pas pris en charge pour la dernière version 3.6 .. et est un cauchemar à installer sur Windows
Tetora
Fonctionne comme un charme sur macOS High Sierra + Python 3.5.2. Je vous remercie!
Anthony L.
Cela crée-t-il un exécutable autonome?
voix
31

Je voudrais compiler des informations utiles sur la création de fichiers autonomes sur Windows à l'aide de Python 2.7.

J'ai utilisé py2exe et cela fonctionne, mais j'ai eu quelques problèmes.

Cette dernière raison m'a fait essayer PyInstaller http://www.pyinstaller.org/ .

À mon avis, c'est beaucoup mieux parce que:

  • Il est plus simple à utiliser.

Je suggère par exemple de créer un fichier .bat avec les lignes suivantes (pyinstaller.exe doit être dans le chemin Windows):

pyinstaller.exe --onefile MyCode.py

Donc, je pense que, au moins pour python 2.7, une option meilleure et plus simple est PyInstaller.

Diego
la source
3
L' --onefileindicateur ne vous aidera pas à le rendre portable sur Windows, car l'exécutable veut toujours se lier à la api-ms-win-crt-runtime-l1-1-0.dllbibliothèque (ou / et autres) qui doit être installée via le vcredistpackage. Une dépendance est donc toujours là et doit être installée avant l'exécution.
Andry
27

Oui, il est possible de compiler des scripts Python en exécutable autonome.

PyInstaller peut être utilisé pour convertir des programmes Python en exécutables autonomes, sous Windows , Linux , Mac OS X , FreeBSD , Solaris et AIX . C'est l'un des convertisseurs recommandés.

py2exe convertit les scripts Python en exécutables uniquement sur la plate-forme Windows.

Cython est un compilateur statique pour le langage de programmation Python et le langage de programmation Cython étendu.

fury.slay
la source
2
Merci pour cela. J'utilisais py2exe et je ne pouvais pas du tout faire fonctionner les icônes avec. PyInstaller a fonctionné pour la première fois et a fière allure!
Chud37
Puis-je créer un exécutable autonome à partir de Windows pour Linux et macOS? Ou dois-je installer Linux et macOS sur VirtualBox? Je n'ai pas assez d'espace libre sur mon ordinateur portable.
8Observer8
1
J'ai trouvé la réponse à ma question dans la documentation ici: pyinstaller.readthedocs.io/en/stable/…
8Observer8
26

Et une troisième option est cx_Freeze, qui est multiplateforme.

Katriel
la source
1
Nous sommes ici en février 2019 et il n'y a pas de liste cx_Freeze versions sur pypi depuis fin 2017. Ce projet a-t-il été abandonné?
user9074332
17

vous aimerez peut-être py2exe . vous y trouverez également des infos pour le faire sur linux

user237419
la source
2
Mais vous devrez lui donner toutes les options du package.
Jakob Bowyer
14

Utilisez py2exe .... utilisez les fichiers de configuration ci-dessous:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )
Anand
la source
J'ai fait cela et il a créé un fichier python27.dll et il est toujours requis. J'ai déplacé le fichier .exe hors du dossier contenant le fichier python27.dll et le fichier .exe ne s'exécute plus.
mjwrazor
Pourriez-vous montrer un tel script pour Linux et macOS? Je souhaite créer des fichiers exécutables autonomes à partir de Windows pour Linux et macOS.
8Observer8
13

J'aime pyinstaller - en particulier la variante "fenêtrée":

pyinstaller --onefile --windowed myscript.py

Il créera un seul fichier * .exe dans un dossier dist /.

cslotty
la source
11

Je recommande également pyinstaller pour une meilleure compatibilité descendante comme python 2.3 - 2.7.
pour py2exe , vous devez avoir python 2.6

yantaq
la source
pyinstaller a des problèmes d'importation. Par exemple: dans mon cas, je suis dans ce DIR ~ / Documents / python101 / et ex50_pycomp.py & ex50.py sont dans ce répertoire. ex50_pycomp.py importation ex50.py. Je lance pyinstaller ex50_pycomp.py et je vois tout conforme, produit dist. Tout va bien, non? Je cd dans dist / ex50_pycomp / et je lance ex50_pycomp ça marche. Une fois que j'ai mis cet ex50_pycom dans une machine virtuelle, cela indique une erreur d'importation et dans une autre boîte Linux, il est dit "-bash: ./ex_50_pycom: ne peut pas exécuter le fichier binaire: erreur de format Exec"
driven_spider
prob1: J'utilisais python2.7 mais pyinstaller parlait avec python3 python3 setup.py build python3 setup.py installer votre python3 obtiendra tous les pkg_resources prob 3: si l'utilisation de sys_path devient un problème alors donnez votre chemin comme celui-ci pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: dossier d'installation de python3 dist --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
driven_spider
8

Pour les scripts Python 3.2, le seul choix est Cxfreeze. Construisez-le à partir de sources, sinon cela ne fonctionnera pas.

Pour python 2.x, je suggère pyinstaller car il peut empaqueter un programme python dans un seul exécutable, contrairement à CxFreeze qui génère également des bibliothèques.

ravi.chunduru
la source
6

py2exe fera le fichier exe que vous voulez mais vous devez avoir la même version de MSVCR90.dll sur la machine sur laquelle vous allez utiliser votre nouvel exe. Voir http://www.py2exe.org/index.cgi/Tutorial pour plus d'informations.

Bélial
la source
6

Vous pouvez trouver la liste des utilitaires de distribution répertoriés sur https://wiki.python.org/moin/DistributionUtilities .

J'utilise bbfreeze et cela a très bien fonctionné (mais n'a pas encore le support de python 3).

Joe
la source
stackoverflow.com/questions/33683133/… J'utilise bbfreeze très joli package.
user914425
Prend-il en charge les dépendances et installe-t-il les modules py appropriés?
Volatil3
@ Volatil3 Oui, toutes les dépendances sont prises en charge. WRT à l'installation de modules sur le système hôte - il existe différents types de compilations. Le bbfreeze compilera tout dans plusieurs .sofichiers, ou copiera les fichiers .egg directement et ils seront tous présents dans un seul répertoire (ou comme un seul fichier). Aucune installation n'est requise.
Joe
6
pyinstaller yourfile.py -F --onefile

Cela crée un fichier EXE autonome dans Windows REMARQUE IMPORTANTE: Le fichier exe sera généré dans un dossier nommé «dist»

vous pouvez installer pyinstaller en utilisant pip install PyInstaller

entrez la description de l'image ici

entrez la description de l'image ici

ShadyMBA
la source
4

Pas exactement un emballage du code python, mais il y a maintenant aussi grincheux de google, qui transpile le code à Go. Il ne prend pas en charge l'API python C, il peut donc ne pas fonctionner pour tous les projets.

freeformz
la source
4

En utilisant pyinstaller, j'ai trouvé une meilleure méthode en utilisant un raccourci vers le .exe plutôt qu'en créant --onefile. Quoi qu'il en soit, il y a probablement des fichiers de données autour et si vous exécutez une application basée sur un site, votre programme dépend également des fichiers html, js, css. Inutile de déplacer tous ces fichiers quelque part. Et si nous déplaçons le chemin de travail vers le haut.

Faites un raccourci vers l'exe, déplacez-le en haut et définissez les chemins cible et de démarrage comme spécifié, pour avoir des chemins relatifs allant vers le dossier dist \: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" peut renommer le raccourci en n'importe quoi donc renommer en "GTFS-Manager"
Maintenant quand je double -cliquez sur le raccourci, c'est comme si j'avais python-exécuté le fichier! J'ai trouvé cette approche meilleure que --onefilecelle en tant que:

  1. Dans le cas d'un fichier, il y a un problème avec un .dll manquant pour le système d'exploitation win7 qui nécessite une installation préalable, etc. Yawn. Avec la construction habituelle avec plusieurs fichiers, pas de tels problèmes.
  2. Tous les fichiers que mon script python utilise (il déploie un serveur Web de tornade et a besoin d'un site Web de fichiers pour être là!) N'ont pas besoin d'être déplacés n'importe où: je crée simplement le raccourci en haut.
  3. Je peux réellement utiliser ce même dossier exact dans Ubuntu (exécutez python3 myfile.py) et Windows (double-cliquez sur le raccourci).
  4. Je n'ai pas besoin de me soucier du piratage trop compliqué du fichier .spec pour inclure des fichiers de données, etc.

Oh, n'oubliez pas de supprimer le dossier de construction après la construction, vous économiserez de la taille.

Nikhil VJ
la source
Salut, juste une mise à jour .. J'ai décidé de renoncer à la compression UPX et de suivre enfin le chemin --onefile. J'ai dû en choisir un, car UPX a actuellement un bug dans la compression d'une DLL particulière.
Nikhil VJ
3

Utilisez Cython pour convertir en c, compiler et lier avec gcc. Une autre pourrait être de rendre les fonctions de base en c (celles que vous voulez rendre difficiles à inverser), de les compiler et d'utiliser Python Boost pour importer le code compilé (en plus, vous obtenez une exécution de code beaucoup plus rapide). puis utilisez n'importe quel outil mentionné pour distribuer.

F.Moure
la source
1

On me dit que PyRun, https://www.egenix.com/products/python/PyRun/ , est également une option.

Kraig Brockschmidt - MSFT
la source
5
Un lien vers une solution est le bienvenu, mais assurez-vous que votre réponse est utile sans elle: ajoutez du contexte autour du lien pour que vos collègues aient une idée de ce que c'est et pourquoi il est là, puis citez la partie la plus pertinente de la page que vous '' relier à au cas où la page cible n'est pas disponible. Les réponses qui ne sont guère plus qu'un lien peuvent être supprimées.
Petter Friberg
Cette option ne prend actuellement pas en charge Windows.
bob