Comment puis-je distribuer des programmes python?

102

Mon application ressemble à ceci:

main.py
les fenêtres/
    __init__.py
    mainwindow.py
    ...
modèle/
    __init__.py
    commandes.py
    ...
Ressources/
    image1.png
    logo.jpg
    ...

Le programme démarre avec main.py. Y a-t-il un bon moyen d'en créer une application «finale»? Je pense à quelque chose comme py2exe / py2app, mais sans copier l'interpréteur / modules python dans l'application où l'on n'a qu'un seul exécutable.

J'ai jeté un coup d'œil à distutils, mais il semble que cela installe un programme dans le répertoire Python, ce qui n'est pas habituel sur les plates-formes non Linux.

Pour le moment, je copie simplement le dossier source entier sur la machine cible et crée un alias main.pywsur Windows. Quelques inconvénients:

  • L'icône est l'icône python par défaut.
  • Je dois créer l'alias manuellement.
  • Dans mon répertoire source, il y a beaucoup de fichiers supplémentaires comme le dossier de contrôle de source.
  • Je dois renommer main.pyà la main.pywmain.
  • Ce serait bien si seuls les fichiers `.pyo * se trouvent sur la machine cible. Il n'y a pas de vraie raison à cela, je n'aime tout simplement pas avoir des fichiers inutiles.

Comment créer une belle distribution automatisée?

  • Pour les fenêtres? (C'est la seule plateforme que je dois prendre en charge pour le moment.)
  • pour Mac?
  • pour linux?
Georg Schölly
la source
2
«J'ai jeté un œil à distutils, mais il semble que cela installe un programme dans le répertoire Python, ce qui n'est pas habituel sur les plates-formes non Linux.» Pourquoi dites-vous cela? Quel texte avez-vous lu pour dire cela? C'est certainement faux, d'où avez-vous eu cette impression?
S.Lott
Reproduction

Réponses:

37

La manière normale de distribuer des applications Python est avec distutils . Il est conçu à la fois pour la distribution de modules python de type bibliothèque et d'applications python, bien que je ne sache pas comment cela fonctionne sous Windows. Vous auriez sous Windows à installer Python séparément si vous utilisez distutils, dans tous les cas.

Je vous recommanderais probablement de le distribuer avec disutils pour Linux et Py2exe ou quelque chose de similaire pour Windows. Pour OS XI ne sais pas. Si c'est une application utilisateur final, vous voudriez probablement un type d'image disque, je ne sais pas comment faire cela. Mais lisez cet article pour plus d'informations sur l'expérience utilisateur de celui-ci. Pour une application conçue pour les programmeurs, vous êtes probablement d'accord avec une installation de type distutils sur OS X aussi.

Lennart Regebro
la source
1
Mac et Linux ne sont pas si importants pour le moment. Py2app crée des bundles .app. Et je pense que l'envoi d'applications Mac en .dmg est obsolète, il faut utiliser .zip. Est-il possible d'utiliser distutils pour créer simplement un répertoire distet y copier tous les fichiers pertinents?
Georg Schölly
1
@gs: la commande sdist créera un fichier tar de tous les fichiers source.
Martin c.Löwis
5
@gs: L'expédition d'applications Mac en .dmg est en fait extrêmement courante. Les .dmg sont des images disque et non un format pour les applications (ce serait .app). Ainsi, vous trouvez souvent un seul .app dans un .dmg, avec un fichier README.
Eric O Lebigot
2
@gs Je ne sais pas pourquoi vous voulez que distutils crée simplement un répertoire dist et y copie les fichiers, vous pouvez le faire vous-même. Distutils fait beaucoup de choses, y compris la création d'installateurs Windows, et à partir de Python 2.6, crée également des liens dans le menu Démarrer. Cependant, il vous faudra installer Python séparément, donc pour une application utilisateur final, je pense que py2exe est une meilleure solution, car elle inclut son propre Python. L'expédition / les installateurs pour OS X sont discutés en détail par Alexander Limi dans son bloggpost, donc je m'en remets à lui.
Lennart Regebro
61

Je recommande vivement Pyinstaller , qui prend en charge toutes les principales plates-formes de manière assez transparente. Comme py2exe et py2app, il produit un exécutable standard sur Windows et un ensemble d'applications sur OS X, mais a également l'avantage de faire un travail fantastique de résolution automatique des dépendances courantes et de les inclure sans modifications de configuration supplémentaires.

Notez également que si vous déployez Python 2.6 sur Windows, vous devez appliquer ce correctif au tronc Pyinstaller.

Vous avez indiqué que vous n'avez pas besoin d'un programme d'installation, mais Inno Setup est un choix facile à utiliser et rapide à configurer pour la plate-forme Windows.

Daniel Naab
la source
3
Je ne suis pas sûr que ce soit exagéré. Regrouper une application avec Pyinstaller peut en fait être plus facile que d'autres méthodes, en particulier celles qui ont des dépendances sur les extensions c ... aussi simple qu'un appel en ligne de commande dans la plupart des cas. L'installation de Python + des dépendances + de l'application elle-même (que ce soit via distutils, etc., ou simplement un fichier zip) est plus impliquée, surtout si le développeur n'est pas en mesure de configurer manuellement la machine cible lui-même et doit fournir des instructions au client. Au moins sous Windows, je pense que ce style de distribution a du sens.
Daniel Naab
1
Un peu gênant avec pyinstaller, lorsque vous utilisez l'exécutable créé avec pyinstaller, le début de l'exécution prend quelques secondes.
JuanPablo
1
Exactement ce que je cherchais. Je dois parfois laisser mes scripts s'exécuter sur des ordinateurs sur lesquels je ne peux rien installer. Un seul exécutable sans dépendances externes est ce dont j'ai besoin. Je peux consacrer quelques secondes au démarrage. Je vous remercie!
CodeMonkey
Non recommandé pour les petites applications, car un Hello worldprogramme simple prendrait 500 Mo d'espace et 3-5 secondes d'initialisation.
Raf
Vous pouvez éviter cette quantité d'espace en utilisant un environnement séparé pour distribuer votre application (en utilisant venv ou pyenv, par exemple)
Alexander Santos
4

Fredrik Lundh squeeze.pypeut créer un seul fichier qui ne contient pas l'interpréteur Python, mais contient à la place du bytecode. Avec les bons arguments, vous pouvez inclure d'autres fichiers, modules, etc. dans le fichier de résultats. Je l'ai utilisé avec succès dans un projet. Le programme résultant a fonctionné sous OS X, Linux et Windows sans aucun problème!

PS : Chaque machine a besoin d'un interpréteur Python compatible avec le bytecode généré par squeeze.py. Vous pouvez générer différentes versions de bytecode pour différentes versions de Python, si nécessaire (exécutez simplement squeeze.py avec la bonne version de Python).

Eric O Lebigot
la source
4

Je pense qu'il vaut également la peine de mentionner PEX (compte tenu davantage de l'attention que cette question a reçue et moins de la question elle-même). Selon sa propre description :

Les fichiers PEX sont des environnements virtuels Python exécutables autonomes. Plus précisément, ce sont des fichiers zip soigneusement construits avec un #!/usr/bin/env pythonet spécial __main__.pyqui vous permet d'interagir avec le runtime PEX. Pour plus d'informations sur les applications zip, voir PEP 441 .

Je suis tombé dessus en lisant un aperçu de l'empaquetage pour python . Ils y ont posté cette belle photo: entrez la description de l'image ici

Pour résumer: Si vous pouvez vous permettre de compter sur l'installation de python sur la machine cible, utilisez PEX pour produire un »exécutable« autonome qui aura probablement une taille de fichier plus petite qu'un exécutable produit par PyInstaller, par exemple.

user3389669
la source
1

Si vous distribuez sous Windows, utilisez un programme d'installation pour installer tous les fichiers / interpeter pertinents, tout ce qui est nécessaire. Distribuez un setup.exe. C'est la meilleure façon sur Windows. Sinon, les utilisateurs se plaindront.

Byron Whitlock
la source
1
Je n'ai pas besoin d'un installateur car il n'y a qu'un seul utilisateur qui va utiliser le programme. Mais bien sûr, lors de l'écriture d'un programme pour plus d'utilisateurs, c'est un must sur Windows.
Georg Schölly
1
@gs: Oh, un seul utilisateur. Bien, alors je recommanderais de créer un package distutils de base, soit une distribution source, soit un programme d'installation binaire Windows. C'est certainement un moyen simple et agréable de distribuer un module Python.
Lennart Regebro
0

Le moyen multiplateforme le plus pratique * de distribuer des applications de bureau python est de s'appuyer sur le gestionnaire de packages conda multiplateforme. Il existe plusieurs outils qui l'utilisent:

  • Miniconda-Install - scripts powershell / bash qui téléchargent automatiquement Miniconda et créent un environnement conda isolé pour l'application. Prend en charge pip mais semble non maintenu et présente des problèmes de téléchargement https.
  • Projet Anaconda et constructeur (conda) par Continuum. Les deux utilisent conda. (conda) constructeur semble être capable de créer des installateurs autonomes et même des installateurs NSIS sur Windows mais ne prend pas en charge pip. Semblent se comporter comme des installateurs Anaconda / Miniconda.
  • PyAppShare - l'utilisateur final installe d'abord Miniconda / Anaconda (comme un environnement d'exécution). Ensuite, un script d'installation unique par lots / bash crée un environnement conda isolé à partir de la spécification yaml. L'application est également un package conda / pip lui-même qui est installé dans l'environnement et un point d'entrée exécutable est créé. Raccourcis de bureau et de programmes multiplateformes créés automatiquement. Ils activent l'environnement et démarrent l'application. Prend en charge pip.

* Le plus pratique pour le développeur. Assez pratique pour l'utilisateur final.

Peter Zagubisalo
la source