Python, puissant et polyvalent comme il est, manque quelques capacités clés hors de la boîte. D’une part, Python ne fournit aucun mécanisme natif pour compiler un programme Python dans un package exécutable autonome.

Pour être juste, le cas d’utilisation d’origine pour Python n’a jamais appelé à des paquets autonomes. Les programmes Python ont, dans l’ensemble, été exécutés sur place sur des systèmes où vivait une copie de l’interpréteur Python. Mais la popularité croissante de Python a créé une plus grande demande pour l’exécution d’applications Python sur des systèmes sans runtime Python installé.,

Plusieurs tiers ont conçu des solutions pour déployer des applications Python autonomes. La solution la plus populaire du groupe, et la plus mature, est PyInstaller. PyInstaller ne rend pas le processus d’emballage d’une application Python totalement indolore, mais il y va un long chemin.

Dans cet article, nous allons explorer les bases de l’utilisation de PyInstaller, y compris le fonctionnement de PyInstaller, comment utiliser PyInstaller pour créer un exécutable Python autonome, comment affiner les exécutables Python que vous créez et comment éviter certains des pièges courants liés à l’utilisation de PyInstaller.,

Création d’un PyInstaller paquet

PyInstaller est un paquet Python, installé avec le pip (pip install pyinstaller). PyInstaller peut être installé dans votre installation Python par défaut, mais il est préférable de créer un environnement virtuel pour le projet que vous souhaitez empaqueter et y installer PyInstaller.

PyInstaller fonctionne en lisant votre programme Python, en analysant toutes les importations qu’il effectue et en regroupant des copies de ces importations avec votre programme. PyInstaller lit dans votre programme à partir de son point d’entrée., Par exemple, si votre programme est un point d’entrée myapp.py, vous devez exécuter pyinstaller myapp.py pour effectuer l’analyse. PyInstaller peut détecter et empaqueter automatiquement de nombreux paquets Python courants, comme NumPy, mais vous devrez peut-être fournir des conseils dans certains cas. (Plus sur cela plus tard.)

Après avoir analysé votre code et découvert toutes les bibliothèques et modules qu’il utilise, PyInstaller génère ensuite un « fichier de spécifications. »Un script Python avec l’extension .spec, ce fichier comprend des détails sur la façon dont votre application Python doit être emballée., La première fois que vous exécutez PyInstaller sur votre application, PyInstaller générera un fichier de spécifications à partir de zéro et le remplira de valeurs par défaut saines. Ne jetez pas ce fichier; c’est la clé pour affiner un déploiement PyInstaller!

Enfin, PyInstaller tente de produire un exécutable à partir de l’application, livré avec toutes ses dépendances. Une fois terminé, un sous-dossier nommé dist (par défaut, vous êtes libre de spécifier un nom différent) apparaîtra dans le répertoire du projet., Cela contient à son tour un répertoire qui est votre application fournie – il a un fichier.exe à exécuter, ainsi que toutes les bibliothèques et autres fichiers supplémentaires requis.

Tout ce que vous devez faire pour distribuer votre programme, alors, est empaqueter ce répertoire en tant que fichier.zip ou un autre bundle. Le bundle devra généralement être extrait dans un répertoire où l’utilisateur dispose d’autorisations d’écriture pour pouvoir s’exécuter.

IDG

Un .le fichier spec est utilisé pour créer un exécutable avec PyInstaller., Notez les espaces de noms répertoriés dans excludes. Ceux-ci seront laissés en dehors du bundle créé pour économiser de l’espace.

Tester un paquet PyInstaller

Il y a de fortes chances que votre première tentative d’utiliser PyInstaller pour empaqueter une application ne soit pas complètement réussie.

Pour vérifier si votre paquet PyInstaller fonctionne, accédez au répertoire contenant l’exécutable fourni et exécutez le fichier .exe à partir de la ligne de commande., S’il ne s’exécute pas, les erreurs que vous verrez imprimées sur la ligne de commande devraient fournir un indice sur ce qui ne va pas.

La raison la plus courante pour laquelle un paquet PyInstaller échoue est que PyInstaller n’a pas réussi à regrouper un fichier requis. Ces fichiers manquants entrent dans quelques catégories:

  • Importations cachées ou manquantes: Parfois, PyInstaller ne peut pas détecter l’importation d’un paquet ou d’une bibliothèque, généralement parce qu’il est importé dynamiquement. Le paquet ou la bibliothèque devra être spécifié manuellement.,
  • Fichiers autonomes manquants: Si le programme dépend de fichiers de données externes qui doivent être fournis avec le programme, PyInstaller n’a aucun moyen de le savoir. Vous devrez inclure manuellement les fichiers.
  • Binaires manquants: Ici encore, si votre programme dépend d’un binaire externe comme a.DLL que PyInstaller ne peut pas détecter, vous devrez l’inclure manuellement.

La bonne nouvelle est que PyInstaller fournit un moyen facile de résoudre les problèmes ci-dessus., Le fichier.spec créé par PyInstaller comprend des champs que nous pouvons remplir pour fournir les détails que PyInstaller a manqués.

Ouvrez le .spec le fichier dans un éditeur de texte et cherchez la définition de la balise Analysis objet. Plusieurs des paramètres passés à la Analysis listes sont vides, mais ils peuvent être modifiés pour spécifier les détails manquants:

  • hiddenimports cachés ou manquant importations: Ajouter à cette liste une ou plusieurs chaînes avec les noms de bibliothèques que vous souhaitez inclure dans votre application., Si vous voulez ajouter pandas et bokeh, par exemple, vous pouvez spécifier que le . Notez que les bibliothèques en question doivent être installées dans la même instance de Python où vous exécutez PyInstaller.
  • datas manquantes autonome des fichiers: Ajouter un ou plusieurs spécifications de fichiers dans l’arborescence de votre projet que vous souhaitez inclure dans votre projet., Chaque fichier doit être passé en tant que tuple indiquant le chemin relatif au fichier dans votre répertoire de projet et le chemin relatif dans le répertoire de distribution où vous souhaitez placer le fichier. Par exemple, si vous avez un fichier ./models/mainmodel.dat que vous vouliez inclure avec votre application, et vous voulez le placer dans une même sous-répertoire dans votre répertoire de distribution, vous devez utiliser la balise ('./models/mainmodel.dat','./models') comme une entrée dans le hiddenimports liste. Notez que vous pouvez utiliser des caractères génériques de styleglobpour spécifier plus d’un fichier.,
  • binaries manquantes autonome binaires: Comme avec datas, vous pouvez utiliser binaries pour passer d’une liste de tuples de spécifier l’emplacement des fichiers binaires dans l’arborescence du projet et leurs destinations dans le répertoire de distribution. Encore une fois, vous pouvez utiliser des caractères génériques de style glob.

Gardez à l’esprit que toutes les listes transmises àAnalysis peuvent être générées par programme plus tôt dans le fichier.spec., Après tout, le fichier .spec n’est qu’un script Python d’un autre nom.

Après avoir apporté des modifications au fichier .spec, réexécutez PyInstaller pour reconstruire le paquet. Cependant, à partir de maintenant, assurez-vous de passer le fichier .spec modifié comme paramètre (par exemple pyinstaller myapp.spec). Testez l’exécutable comme avant. Si quelque chose est toujours cassé, vous pouvez modifier à nouveau le fichier .spec et répéter le processus jusqu’à ce que tout fonctionne.,

Enfin, lorsque vous êtes satisfait que tout fonctionne comme prévu, vous pouvez modifier le fichier.spec pour empêcher votre application packagée de présenter une fenêtre de ligne de commande lors du lancement. Dans les paramètres de l’objetEXE dans le fichier.spec, définissezconsole=False. La suppression de la console est utile si votre application dispose d’une interface graphique et que vous ne voulez pas qu’une fausse fenêtre de ligne de commande égare les utilisateurs. Bien sûr, ne modifiez pas ce paramètre si votre application nécessite une ligne de commande.,

Affiner un package PyInstaller

Une fois que votre application est emballée avec PyInstaller et fonctionne correctement, la prochaine chose que vous voudrez probablement faire est de la réduire un peu. Les paquets PyInstaller ne sont pas connus pour être svelte.

Parce que Python est un langage dynamique, il est difficile de prédire exactement ce qui sera nécessaire à l’exécution par un programme donné. Pour cette raison, lorsque PyInstaller détecte une importation de package, il inclut tout dans ce package, qu’il soit réellement utilisé ou non lors de l’exécution par votre programme.

Voici la bonne nouvelle., PyInstaller inclut un mécanisme permettant d’exclure sélectivement des paquets entiers ou des espaces de noms individuels dans des paquets. Par exemple, disons que votre programme d’importations paquet foo, qui comprend foo.bar et foo.bip. Si vous savez pour un fait que votre programme utilise la logique dans foo.bar, vous pouvez en toute sécurité exclure foo.bip et économiser de l’espace.

Pour ce faire, vous utilisez la balise excludes paramètre passé à la balise Analysis objet dans le .spec fichier., Vous pouvez passer une liste de noms-modules de niveau supérieur ou espaces de noms en pointillés — à exclure de votre package. Par exemple, pour exclure foo.bip, il vous suffit de spécifier .

IDG

Le répertoire des livrables créé par PyInstaller. En raison du grand nombre de fichiers dans le répertoire, un projet d’installation tiers comme NSIS peut être utilisé pour emballer le répertoire dans une archive auto-extractible et créer automatiquement un raccourci vers l’exécutable.,

Une exclusion courante que vous pouvez faire esttkinter, la bibliothèque Python pour créer des interfaces utilisateur graphiques multiplateformes simples. Par défaut, tkinter et tous ses fichiers de support sont emballés avec un projet PyInstaller. Si vous n’êtes pas à l’aide de tkinter dans votre projet, vous pouvez l’exclure en ajoutant 'tkinter' à la balise excludes liste. Omettre tkinter réduira la taille du paquet d’environ 7 Mo.

Une autre exclusion courante est les suites de tests., Si un package que votre programme importe a une suite de tests, la suite de tests peut finir par être incluse dans votre package PyInstaller. Sauf si vous exécutez réellement la suite de tests dans votre programme déployé, vous pouvez l’exclure en toute sécurité.

gardez à l’esprit que les paquets créés en utilisant les exclusions doivent être testés avant d’être utilisés. Si vous finissez par exclure les fonctionnalités utilisées dans un scénario futur que vous n’aviez pas anticipé, votre application se cassera.

Conseils PyInstaller

  • Construisez votre package PyInstaller sur le système d’exploitation sur lequel vous prévoyez de déployer., PyInstaller ne prend pas en charge les builds multiplateformes. Si vous devez déployer votre application Python autonome sur les systèmes macOS, Linux et Windows, vous devrez installer PyInstaller et créer des versions distinctes de l’application sur chacun de ces systèmes d’exploitation.
  • Créez votre package PyInstaller au fur et à mesure que vous développez votre application. Dès que vous savez que vous allez déployer votre projet avec PyInstaller, construisez votre fichier.spec et commencez à affiner le package PyInstaller en parallèle avec le développement de votre application., De cette façon, vous pouvez ajouter des exclusions ou des inclusions que vous allez, et de tester les nouvelles fonctionnalités sont déployées avec l’app que vous les écrivez.
  • N’utilisez pas le mode--onefile de PyInstaller. PyInstaller comprend un commutateur de ligne de commande, --onefile, qui emballe toute votre application dans un seul exécutable auto-extractible. Cela semble être une excellente idée – vous n’avez qu’à livrer un seul fichier! — mais il a des pièges à éviter. Chaque fois que vous exécutez l’application, elle doit d’abord décompresser tous les fichiers de l’exécutable dans un répertoire temporaire., Si l’application est grande (200 Mo, par exemple), le déballage peut signifier un délai de plusieurs secondes. Utilisez plutôt le mode répertoire unique par défaut et emballez tout en tant que fichier .zip.
  • Créez un programme d’installation pour votre application PyInstaller. Si vous voulez un moyen de déployer votre application autre qu’un .fichier zip, envisagez d’utiliser un utilitaire d’installation comme le système d’installation open source Nullsoft Scriptable. Il ajoute très peu de frais généraux à la taille du livrable et vous permet de configurer de nombreux aspects du processus d’installation, comme la création de raccourcis vers votre exécutable.,
  • Ne vous attendez pas à des accélérations. PyInstaller est un système d’empaquetage, pas un compilateur ou un optimiseur. Le code empaqueté avec PyInstaller ne s’exécute pas plus rapidement qu’il ne le ferait lorsqu’il était exécuté sur le système d’origine. Si vous souhaitez accélérer le code Python, utilisez une bibliothèque C-accelerated adaptée à la tâche, ou un projet comme Cython.,comment installer Python de manière intelligente
  • Meilleure gestion de projet Python avec Poetry
  • Virtualenv et venv: Les environnements virtuels Python expliqués
  • Python virtualenv et venv à faire et à ne pas faire
  • Python threading et sous-processus expliqués
  • Comment utiliser le débogueur Python
  • Comment utiliser timeit pour profiler le code Python
  • Comment utiliser cProfile pour profiler le code Python
  • Commencez avec async en Python
  • Comment utiliser asyncio en Python
  • Comment convertir Python en JavaScript (et vice-versa)