Comment empaqueter des applications Python avec BeeWare Briefcase

Python n'est pas à la hauteur dans certains domaines. Par exemple, Python n'est pas le langage le plus rapide, mais des bibliothèques tierces comme NumPy vous permettent de contourner ce problème. Là où Python est le plus déficient, cependant, c'est l'empaquetage. Autrement dit, Python n'a pas de mécanisme interne cohérent pour générer un binaire autonome à partir d'une application. Allez et Rust faites ça. Pourquoi pas Python?

Cela revient principalement au fait que Python n'a pas de culture de tels cas d'utilisation jusqu'à relativement récemment dans son histoire. Et donc, ce n'est que relativement récemment que des modules tiers ont commencé à apparaître qui permettent aux applications Python d'être empaquetées en tant que binaires autonomes. PyInstaller - que j'ai abordé précédemment - est l'une de ces applications. Dans cet article, nous examinerons un utilitaire encore plus élégant et puissant pour l'empaquetage d'applications Python, le porte-documents de BeeWare.

[Aussi sur: Python virtualenv et venv à faire et à ne pas faire]

Cependant, il y a deux mises en garde à signaler à propos de Porte-documents. Premièrement, Briefcase ne fait pas de packaging multiplateforme; vous devez vous appuyer sur la plate-forme pour laquelle vous déployez. Deuxièmement, le porte-documents fonctionne mieux avec les applications qui utilisent une boîte à outils GUI. Nous détaillerons ces problèmes ci-dessous.

Qu'est-ce que le porte-documents BeeWare?

Le porte-documents fait partie d'une suite générale d'outils de BeeWare pour créer des applications, les différentes pièces se complétant les unes les autres. Par exemple, Kivy de BeeWare vous permet de créer des applications d'interface graphique multiplateformes en Python qui s'exécutent non seulement sur toutes les principales plates-formes de système d'exploitation, mais également sur le Web. Mais ici, nous allons nous concentrer sur le porte-documents, qui peut être utilisé avec ou sans les autres outils.

Le porte-documents regroupe des applications pour tous les systèmes d'exploitation qu'il prend en charge au moyen d'un format commun pour les applications sur cette plate-forme:

  • Microsoft Windows (programme d'installation MSI)
  • macOS ( .app fichier de format)
  • Linux (AppImage)
  • iOS (projet Xcode)
  • Android (projet Gradle)

Pour déployer sur iOS ou Android, vous aurez besoin des kits de développement pour ces plates-formes.

Une chose que Briefcase ne prend  pas en  charge est le déploiement multiplateforme. Par exemple, si vous êtes un utilisateur Windows, vous ne pouvez pas créer une application macOS; vous aurez besoin de macOS pour le faire. Les autres bundleurs d'applications pour Python sont également limités, cette restriction n'est donc en aucun cas exclusive à Briefcase.

Briefcase n'est pas non plus un «compilateur» - il ne transforme pas les programmes Python en leurs équivalents de code machine natif. Vos applications ne fonctionneront pas plus rapidement lorsqu'elles sont déployées en tant qu'applications Porte-documents qu'elles ne le font normalement.

Configuration du projet porte-documents

Le porte-documents vous oblige à configurer un répertoire de projet dédié avec son propre environnement virtuel. Si vous n'êtes pas encore familiarisé avec les «venv», comme on les appelle les environnements virtuels Python, cela vaut la peine de se familiariser avec eux, car le développement Python de pointe tourne fortement autour d'eux.

Une fois que vous avez configuré un venv et pip install briefcase que vous l'avez intégré  , vous utiliserez les propres outils de ligne de commande de Briefcase pour configurer, gérer et livrer des projets packagés. Cela ressemble à la façon dont fonctionnent des outils tels que Poetry: la plupart de vos interactions de haut niveau avec le projet se font via l'outil, vous n'avez donc pas à créer manuellement des fichiers ou à modifier des configurations.

Pour lancer un nouveau projet Porte-documents, ouvrez l'interface de ligne de commande dans le répertoire de votre projet, activez l'environnement virtuel (en supposant que vous n'utilisez pas l'interface de ligne de commande d'un IDE pour le faire automatiquement) et tapez  briefcase new. Cela crée un échafaudage dans votre répertoire de projet pour un projet Porte-documents.

Vous devrez d'abord répondre à quelques questions sur le projet, et pour la plupart d'entre elles, vous pouvez simplement appuyer sur  Enter pour accepter la valeur par défaut. Mais l'une des questions qui vous sera posée - la dernière, en fait - compte beaucoup: le choix du cadre d'interface graphique à utiliser.

L'une des autres offres de BeeWare est une boîte à outils d'interface utilisateur appelée Toga, pour créer des interfaces graphiques dans les programmes Python à l'aide de composants d'interface utilisateur natifs de la plate-forme. Si vous voulez vous lancer dans l'apprentissage du Toga tout en travaillant également avec Porte-documents, rien ne vous en empêche. Ou vous pouvez sélectionner «Aucun» et créer une application «sans tête» qui s'exécute à partir de la ligne de commande, ou vous pouvez utiliser une boîte à outils d'interface utilisateur tierce ou un système de fenêtrage tel que Pyglet ou PyQT.

Notez que si vous n'installez aucune boîte à outils d'interface utilisateur, l'application n'aura aucune interactivité de la console, c'est-à-dire qu'elle n'ouvrira pas de fenêtre de console et n'imprimera rien sur la console. Ceci est utile si vous déployez un programme qui ne nécessite pas d'interaction avec la console - par exemple, s'il s'exécute en tant que serveur Web local et utilise un navigateur Web pour l'interaction. Mais il n'y a pour l'instant aucune option permettant aux programmes Porte-documents sans package d'interface utilisateur installé de s'exécuter avec une console.

Structure du projet porte-documents

Un répertoire de l'application Briefcase fraîchement lancé est livré avec plusieurs fichiers préinstallés:

  • Le niveau supérieur du répertoire de l'application contient la licence du projet, le  pyproject.toml fichier, un exemple de fichier README au format ReStructured Text et un  .gitignore fichier pré-personnalisé avec des répertoires communs à omettre de tout référentiel Git créé pour le projet.
  • Le  src répertoire contient le code source de votre application, avec deux sous-répertoires: un contenant l'application (il porte le même nom que le répertoire de votre projet) et l'autre contenant les métadonnées de l'application.
  • Le répertoire de l'application contient un  resources répertoire utilisé pour stocker des ressources telles que des icônes d'application.

Commandes du projet porte-documents

La  briefcase commande est la façon dont vous effectuez la plupart de vos interactions avec un projet Porte-documents. Nous avons couvert la  new commande ci-dessus, qui est utilisée pour configurer un projet Porte-documents dans un dossier donné. Mais vous aurez généralement besoin d'utiliser de nombreuses autres commandes pendant le cycle de vie d'une application Porte-documents, et certaines d'entre elles peuvent être un peu contre-intuitives.

Voici les commandes porte-documents les plus courantes que vous utiliserez:

  • dev: Lorsque vous êtes dans un répertoire d'application, cette commande exécute cette application en  mode développement . Le mode Dev vous permet d'exécuter l'application avec son complément complet de bibliothèques installées, mais sans avoir besoin d'être formellement emballé pour la livraison. La plupart du temps, lors du développement de votre application, vous la testerez en mode dev. Si des dépendances ont changé depuis la dernière exécution  dev, utilisez l'  -d indicateur pour les mettre à jour.
  • build: Crée une copie de l'application sous la forme nécessaire pour l'empaqueter pour la distribution. Cela diffère du fait  dev que vous pouvez créer pour différentes plates-formes si l'échafaudage est installé.
  • update: Met à jour une version d'application. C'est le moyen le plus rapide de vous assurer que la construction de votre application contient le code le plus récent, plutôt que d'utiliser  build, qui régénère beaucoup plus de fichiers. Transmettez l'  -d indicateur pour mettre à jour les dépendances et l'  -rindicateur pour mettre à jour les ressources (c'est-à-dire pour copier les ressources de la version de développement de votre application vers la version de build).
  • run: Exécute la version intégrée de l'application. Cela simule essentiellement l'exécution de la version packagée et déployée de l'application. Passez l'  -u indicateur pour mettre à jour n'importe quel code avant d'exécuter.
  • package: Crée un package d'installation d'application à partir de la version intégrée de l'application. Le résultat final est un artefact que vous pouvez donner à d'autres pour installer votre programme - par exemple, un .MSI sous Windows.

Voici quelques-unes des commandes porte-documents les moins couramment utilisées: 

  • create: À ne pas confondre avec  newcreate crée l'échafaudage pour un programme d'installation d'application - un moyen de créer le programme d'installation de l'application pour une plate-forme particulière. Lorsque vous configurez une application avec  new, elle est fournie avec un échafaudage pour la plate-forme sur laquelle vous travaillez; create vous permet d'ajouter des échafaudages pour une autre plate-forme si nécessaire. 
  • upgrade: Met à niveau les composants utilisés pour empaqueter l'application, tels que le framework Wix.
  • publish: Publie l'application packagée sur un canal de publication tel qu'un magasin d'applications. (Au moment d'écrire ces lignes, cette fonctionnalité ne fonctionne pas encore.)

Pour résumer, voici l'ordre dans lequel vous utiliseriez les commandes Porte-documents dans le cycle de vie typique d'une application:

  • new pour créer l'application
  • dev pour exécuter l'application pendant que vous travaillez dessus
  • build pour créer une version de l'application à emballer pour la distribution
  • run pour tester la version packagée de l'application
  • update pour garder la version packagée de l'application à jour avec les changements de code
  • package pour déployer la version packagée de l'application avec un programme d'installation

Création d'applications porte-documents

La création d'un programme Python en tant qu'application Porte-documents revient à créer une autre application Python. Les principaux problèmes concernent la structure du projet. Le point d'entrée __main__.py de l'application se trouve  dans le répertoire de l'application, qui se charge à  app.py partir du même répertoire et s'exécute  main(). Lorsque vous initialisez un projet, il est rempli avec des versions d'espace réservé de certains fichiers de projet, que vous pouvez créer ou remplacer selon vos besoins.

Si vous transformez un   projet existant pour utiliser Briefcase, assurez-vous de le structurer de telle manière que son point d'entrée soit ce que Briefcase attend. Par exemple, si vous n'avez pas stocké le code dans un  src répertoire, vous devrez déplacer votre code dans  src et corriger les incompatibilités dans ses chemins et ses structures de répertoire.

L'autre chose à garder à l'esprit est de savoir comment gérer les dépendances tierces. Le  pyproject.toml fichier de votre répertoire de projet contrôle les dépendances à ajouter au projet. Si votre projet est nommé  myproject, il  pyproject.toml contiendra une section nommée  [tool.briefcase.app.myproject], avec une  requires ligne qui répertorie chaque exigence telle qu'elle serait spécifiée dans un  requirements.txt fichier. Si votre projet nécessite, par exemple,  regex et  black, vous définiriez cette ligne sur  requires = ["regex","black"]. Vous utiliseriez ensuite  briefcase dev -d pour mettre à jour les dépendances pour la version de développement du projet et  briefcase update -d pour mettre à jour les dépendances dans la version packagée.

Emballage et livraison de l'application porte-documents

Une fois que vous avez exécuté  briefcase package, vous verrez un redistribuable pour votre programme apparaître dans un sous-répertoire du répertoire du projet qui correspond à la plate-forme pour laquelle vous avez construit. Pour Microsoft Windows, par exemple, le répertoire sera  windows, et le redistribuable sera un  .msi fichier avec le même nom que votre projet. Pour Android et iOS, les résultats seront des projets pour Gradle et Xcode, respectivement, et ceux-ci devront être compilés à l'aide de ces outils pour être déployables sur ces plates-formes.

Comment faire plus avec Python

  • Comment faire fonctionner Anaconda côte à côte avec d'autres pythons
  • Comment utiliser les classes de données Python
  • Démarrez avec async en Python
  • Comment utiliser asyncio en Python
  • 3 étapes pour une refonte asynchrone Python
  • Comment utiliser PyInstaller pour créer des exécutables Python
  • Tutoriel Cython: Comment accélérer Python
  • Comment installer Python de manière intelligente
  • Comment gérer des projets Python avec Poetry
  • Comment gérer des projets Python avec Pipenv
  • Virtualenv et venv: les environnements virtuels Python expliqués
  • Python Virtualenv et Venv à faire et à ne pas faire
  • Explication des threads et sous-processus Python
  • Comment utiliser le débogueur Python
  • Comment utiliser timeit pour profiler le code Python
  • Comment utiliser cProfile pour profiler le code Python
  • Comment convertir Python en JavaScript (et inversement)