Créer un seul exécutable à partir d'un projet Python

87

Je souhaite créer un seul exécutable à partir de mon projet Python. Un utilisateur devrait pouvoir le télécharger et l'exécuter sans avoir besoin d'installer Python. Si je distribuais juste un package, je pourrais utiliser pip, wheel et PyPI pour le construire et le distribuer, mais cela nécessite que l'utilisateur dispose de Python et sache comment installer des packages. Que puis-je utiliser pour créer un exécutable autonome à partir d'un projet Python?

ShadowFlame
la source
J'écris toujours en 2.x (2.7.2 pour être exact), mais je pourrais voir la nécessité de transférer vers 3.x (si les modules et autres sont compatibles) et j'aurais également besoin d'une solution.
ShadowFlame
Notez que l'emballage compliquera considérablement le diagnostic des problèmes. Non seulement vous (ou pdb) n'avez pas un accès facile aux fichiers en cours d'exécution, py2exe( je ne sais pas pour les autres) n'inclut pas les .pyfichiers, vous ne verrez donc pas les lignes source dans les traces de pile.
ivan_pozdeev
Juste comme point d'intérêt, j'ai commencé à utiliser pyinstaller
ShadowFlame

Réponses:

114

Voici quelques exemples courants. Sauf indication contraire, tous les projets énumérés ci-dessous sont activement maintenus à partir de ma dernière modification (janvier 2020).

J'ai également inclus des liens vers leurs sites Web respectifs, leurs dépôts et leurs listes PyPi au cas où vous voudriez vérifier par vous-même à quelle fréquence ils ont été mis à jour.

Aussi, sauf indication contraire, tous les programmes listés ci-dessous produiront un exe spécifiquement pour le système d'exploitation dans lequel il s'exécute. Ainsi, par exemple, exécuter Pyinstaller sous Windows produira un exe Windows, mais exécuter Pyinstaller sous Linux produira un exe Linux. Si vous souhaitez produire un exe pour plusieurs systèmes d'exploitation, vous devrez vous pencher sur l'utilisation de machines virtuelles ou envisager d'utiliser quelque chose comme Wine .


Les programmes suivants fonctionnent tous de la même manière - ils regroupent Python et votre programme, les combinant efficacement pour produire un exécutable.

  • PyInstaller:

    • Liens : Site Web || Repo || PyPi
    • Prise en charge : Python 2.7 et Python 3.4 - 3.7 sous Windows, Mac et Linux.
  • cx_Freeze:

    • Liens: Site Web || Repo || PyPi
    • Prise en charge: Python 2.7 et 3.5 - 3.8 sur Windows, Mac et Linux.
  • py2app:

    • Liens: Site Web || Repo || PyPi
    • Prise en charge: Python 2.7 et 3.3 (?) - 3.7 (?) Sur Mac uniquement.
    • Remarque: lors de ma dernière modification, je n'ai pas été en mesure de déterminer de manière concluante la plage exacte des versions de Python prises en charge par pyapp. La dernière version mentionne la prise en charge de Python 3.7.

Remarque: les versions précédentes de ce post incluaient des écritures pour py2exe ( repo ) et bbfreeze ( repo ). Les deux projets ont été supprimés de cette liste: ils ont vu peu ou pas d'activité pendant plusieurs années et semblent être complètement non maintenus. Voir l'historique des modifications pour les anciennes écritures.


Bien sûr, ce n'est pas la seule façon de faire les choses:

  • pynsiste:

    • Liens: Site Web || Repo || PyPi
    • Prise en charge: toutes les versions de Python? Remarque - créera uniquement des installateurs Windows .
    • Autres notes: Pynsist semble prendre en charge le regroupement de toute version arbitraire de Python avec votre application. Cependant, l'outil lui-même nécessite Python 3.5+ pour s'exécuter.

      Pynsist créera un programme d'installation Windows pour votre programme qui installera directement Python sur l'ordinateur de l'utilisateur au lieu de le regrouper avec votre code et créera des raccourcis qui relient votre script Python. Bien que ce programme ne produise que des programmes d'installation Windows, il semble que vous puissiez toujours exécuter Pynsist sur les ordinateurs Mac et Linux.

  • Nuitka:

    • Liens: Site Web || Repo (miroir Github) || PyPi
    • Prise en charge: Python 2.6 - 2.7 et Python 3.3 - 3.7 sous Windows, Mac et Linux.
    • Autres notes: Nuitka compilera littéralement votre code Python et produira un exe (contrairement aux autres projets, qui incluent simplement Python) pour essayer d'accélérer votre code. En tant qu'effet secondaire, vous obtiendrez également un exe pratique que vous pourrez distribuer. Notez que vous devez avoir un compilateur C ++ disponible sur votre système.
  • cython:

    • Liens: Site Web || Repo || PyPi
    • Prise en charge: Python 2.6 - 2.7 et Python 3.2 - 3.8 sur Windows, Mac et Linux.
    • Autres notes: Cython est similaire à Nuitka en ce sens qu'il s'agit d'un compilateur Python. Cependant, au lieu de compiler directement votre code, il le compilera en C. Vous pouvez ensuite prendre ce code C et transformer votre code en un exe . Vous aurez besoin d'un compilateur C disponible sur votre système.

Ma préférence personnelle est d'utiliser PyInstaller car c'était le plus facile pour moi de démarrer, a été conçu pour fonctionner correctement avec diverses bibliothèques populaires telles que numpy ou pygame, et a une grande compatibilité avec divers systèmes d'exploitation et versions de Python.

Cependant, j'ai également construit avec succès divers ex en utilisant cx_Freeze sans trop de difficulté, vous devriez donc également envisager d'essayer ce programme.

Je n'ai pas encore eu l'occasion d'essayer de manière approfondie pynist, Nuitka ou Cython, mais elles semblent être des solutions assez intéressantes et innovantes. Si vous rencontrez des problèmes lors de l'utilisation du premier groupe de programmes, il peut être intéressant d'essayer l'un de ces trois programmes. Comme ils fonctionnent fondamentalement différemment des programmes de style Pyinstaller / cx_freeze, ils pourraient réussir dans les cas extrêmes où le premier groupe échoue.

En particulier, je pense que pynist est un bon moyen d'éviter tout le problème de la distribution de votre code: les Mac et Linux ont déjà un support natif pour Python, et le simple fait d'installer Python sur Windows pourrait vraiment être la solution la plus propre. (L'inconvénient est maintenant que vous devez vous soucier de cibler plusieurs versions de Python + installer des bibliothèques).

Nuitka et Cython (d'après mon expérience limitée) semblent fonctionner assez bien. Encore une fois, je ne les ai pas testés intensivement moi-même, et donc ma principale observation est qu'ils semblent prendre beaucoup plus de temps pour produire un exe que les programmes de style "freeze".


Cela étant dit, convertir votre programme Python en exécutable n'est pas forcément le seul moyen de distribuer votre code. Pour en savoir plus sur les autres options disponibles, consultez les liens suivants:

Michael0x2a
la source
1
Notez que vous devez également inclure dans votre bundle les redistribuables Microsoft C ++ (aka msvcrxx.dll, où xxest un numéro de version) pour faire fonctionner le .exe (ou demander aux utilisateurs de l'installer eux-mêmes). Cela est nécessaire car Python est construit sur Windows à l'aide de Visual Studio.
gaborous
Il semble donc qu'aucun des IDE python (pycharm ou pydev - eclipse pluggin) n'ait encore incorporé la fonctionnalité de compilation en exécutable unique dans l'EDI lui-même. Est-ce exact? :-)
Nelda.techspiress
Si vous souhaitez protéger votre code source, Cython est probablement le meilleur choix car il compile du code C. Les programmes qui utilisent la technique de congélation peuvent généralement être facilement décompilés.
Martín De la Fuente
PyInstaller est répertorié ci-dessus comme prenant en charge Python 3.7. Ce n'est pas vrai d'après mon expérience et selon la description sur pyinstaller.org, qui indique que "PyInstaller fonctionne avec Python 2.7 et 3.3-3.6".
Tom
1
@Tom - Après avoir creusé un peu plus, il semble que si pyinstaller lui-même prend en charge Python 3.7, ils n'ont pas officiellement publié une nouvelle version avec le support 3.7. (Par exemple, leur dépôt github déclare qu'ils prennent en charge Python 3.7 +, ils semblent n'avoir aucun problème en suspens lié à 3.7, mais la dernière version de pyinstaller sur PyPi date de décembre 2017). Donc, si vous avez besoin du support 3.7, vous pouvez essayer de construire + installer pyinstaller directement à partir des sources, ou attendre la prochaine version. (Ou utilisez un autre programme, bien sûr)
Michael0x2a
10

pyinstaller est toujours en développement actif. Vous pouvez voir les dernières modifications sur GitHub.

Il prend en charge les trois principales plates-formes:

  • Windows (32 bits et 64 bits)
  • Linux (32 bits et 64 bits)
  • Mac OS X (32 bits et 64 bits)

et il prend en charge les versions 2.6 et 2.7 de Python. Il ne prend pas en charge Python 3, mais il existe une branche expérimentale Python 3 .

Mise à jour

À partir de la version 3.2.1, il prend en charge Python 2.7, 3.3-3.5

jterrace
la source
2

Meilleure utilisation pip install auto-py-to-exequi fournit une belle interface utilisateur avec toutes les options nécessaires pour créer un exécutable.

Après l'installation, tapez simplement auto-py-to-exevotre terminal ou votre invite de commande.

Auto-py-to-exe

Ratnesh Kushwaha
la source
merci d'avoir encore répondu sur un fil aussi ancien que celui-ci. Cela semble être une trouvaille incroyable et simplifie vraiment le travail lors de la configuration, ainsi que la fourniture de la commande réellement utilisée: D
ShadowFlame