Aller au contenu

Tutoriel n° 7 - Démarrer cette (troisième-)partie

Jusqu'à présent, l'application que nous avons construite n'a utilisé que notre propre code, ainsi que le code fourni par BeeWare. Cependant, dans une application réelle, vous voudrez probablement utiliser une bibliothèque tierce, téléchargée à partir du Python Package Index (PyPI).

Modifions notre application pour y inclure une bibliothèque tierce.

Ajout d'un paquet

Modifions notre application pour qu'elle dise un peu plus que "Bonjour !".

Pour générer un texte plus intéressant pour le dialogue, nous allons utiliser une bibliothèque appelée Faker. Faker est un paquetage Python qui génère du faux contenu, y compris des noms et des blocs de texte. Les noms et les mots du bloc de texte sont générés à partir d'une liste arbitraire de mots fournie par Faker. Nous allons utiliser Faker pour construire un faux message, comme si quelqu'un répondait à l'utilisateur.

Commençons par ajouter faker à notre application. Ajoutez un import au début de app.py pour importer faker :

import faker

Puis modifiez le callback say_hello() pour qu'il ressemble à ceci :

async def say_hello(self, widget) :
    fake = faker.Faker()
    await self.main_window.dialog(
 toga.InfoDialog(
 greeting(self.name_input.value),
 f"Un message de {fake.name()} : {fake.text()}",
 )
    )

Exécutons notre application mise à jour dans le mode développeur de Briefcase pour vérifier que notre changement a fonctionné.

(beeware-venv) $ briefcase dev
Traceback (dernier appel en dernier) :
Fichier « .../venv/bin/briefcase », ligne 5, dans <module>
    from briefcase.__main__ import main
Fichier « .../venv/lib/python3.13/site-packages/briefcase/__main__.py », ligne 3, dans <module>
    from .cmdline import parse_cmdline
Fichier « .../venv/lib/python3.13/site-packages/briefcase/cmdline.py », ligne 6, dans <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Fichier « .../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py », ligne 1, dans <module>
    from .build import BuildCommand  # noqa
Fichier « .../venv/lib/python3.13/site-packages/briefcase/commands/build.py », ligne 5, dans <module>
    from .base import BaseCommand, full_options
Fichier « .../venv/lib/python3.13/site-packages/briefcase/commands/base.py », ligne 14, dans <module>
    import faker
ModuleNotFoundError : Aucun module nommé « faker »
(beeware-venv) $ briefcase dev
Traceback (dernier appel en dernier) :
Fichier « .../venv/bin/briefcase », ligne 5, dans <module>
    from briefcase.__main__ import main
Fichier « .../venv/lib/python3.13/site-packages/briefcase/__main__.py », ligne 3, dans <module>
    from .cmdline import parse_cmdline
Fichier « .../venv/lib/python3.13/site-packages/briefcase/cmdline.py », ligne 6, dans <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Fichier « .../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py », ligne 1, dans <module>
    from .build import BuildCommand  # noqa
Fichier « .../venv/lib/python3.13/site-packages/briefcase/commands/build.py », ligne 5, dans <module>
    from .base import BaseCommand, full_options
Fichier « .../venv/lib/python3.13/site-packages/briefcase/commands/base.py », ligne 14, dans <module>
    import faker
ModuleNotFoundError : Aucun module nommé « faker »
(beeware-venv) C:\...>briefcase dev
Traceback (dernier appel en dernier) :
Fichier « ...\venv\bin\briefcase », ligne 5, dans <module>
    from briefcase.__main__ import main
Fichier « ...\venv\lib\python3.13\site-packages\briefcase\__main__.py », ligne 3, dans <module>
    from .cmdline import parse_cmdline
Fichier « ...\venv\lib\python3.13\site-packages\briefcase\cmdline.py », ligne 6, dans <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Fichier « ...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py », ligne 1, dans <module>
    from .build import BuildCommand  # noqa
Fichier « ...\venv\lib\python3.13\site-packages\briefcase\commands\build.py », ligne 5, dans <module>
    from .base import BaseCommand, full_options
Fichier « ...\venv\lib\python3.13\site-packages\briefcase\commands\base.py », ligne 14, dans <module>
    import faker
ModuleNotFoundError : Aucun module nommé « faker »

Vous ne pouvez pas exécuter une application Android en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Vous ne pouvez pas exécuter une application iOS en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Que s'est-il passé ? Nous avons ajouté faker à notre code, mais nous ne l'avons pas ajouté à l'environnement virtuel utilisé pour exécuter l'application en mode développement.

Lorsque Briefcase exécute une application en mode développement, il crée un environnement virtuel autonome pour cette application, indépendant de l'environnement dans lequel vous exécutez briefcase. Si votre application ne déclare pas avoir besoin d'une bibliothèque particulière, cette bibliothèque ne sera pas installée dans l'environnement virtuel de développement.

Alors, comment ajouter une nouvelle exigence à votre application ?

Mise à jour des dépendances

Dans le répertoire racine de votre application, il y a un fichier nommé pyproject.toml. Ce fichier contient tous les détails de configuration de l'application que vous avez fournis lorsque vous avez lancé briefcase new.

pyproject.toml est divisé en sections ; l'une d'entre elles décrit les paramètres de votre application :

[tool.briefcase.app.helloworld]
formal_name = "Hello World"
description = "Une application didactique"
long_description = """Vous pouvez ajouter ici plus de détails sur l'application.
"""
sources = ["src/helloworld"]
requires = []

L'option requires décrit les dépendances de notre application. Il s'agit d'une liste de chaînes de caractères spécifiant les bibliothèques (et, éventuellement, les versions des bibliothèques) que vous souhaitez inclure dans votre application.

Modifiez le paramètre requires de façon à ce qu'il se lise :

requires = [
    "faker",
]

En ajoutant ce paramètre, nous disons à Briefcase : "lorsque vous compilez mon application, lancez pip install faker dans le bundle de l'application". Tout ce qui serait une entrée légale pour pip install peut être utilisé ici - ainsi, vous pourriez spécifier :

  • Une version spécifique de la bibliothèque (par exemple, "faker==37.3.0") ;
  • Une gamme de versions de la bibliothèque (par exemple, "faker>=37") ;
  • Un chemin vers un dépôt git (par exemple, "git+https://github.com/joke2k/faker/") ; ou
  • Un chemin d'accès à un fichier local (Cependant, attention : si vous donnez votre code à quelqu'un d'autre, ce chemin d'accès n'existera probablement pas sur sa machine !)

Plus loin dans pyproject.toml, vous remarquerez d'autres sections qui dépendent du système d'exploitation, comme [tool.briefcase.app.helloworld.macOS] et [tool.briefcase.app.helloworld.windows]. Ces sections ont également un paramètre requires. Ces paramètres vous permettent de définir des dépendances supplémentaires spécifiques à une plate-forme - ainsi, par exemple, si vous avez besoin d'une bibliothèque spécifique à une plate-forme pour gérer un aspect de votre application, vous pouvez spécifier cette bibliothèque dans la section requires'' spécifique à la plate-forme, et ce paramètre ne sera utilisé que pour cette plate-forme. Vous remarquerez que les bibliothèquestogasont toutes spécifiées dans la sectionrequires` spécifique à la plate-forme - c'est parce que les bibliothèques nécessaires pour afficher une interface utilisateur sont spécifiques à la plate-forme.

Dans notre cas, nous voulons que faker soit installé sur toutes les plateformes, donc nous utilisons le paramètre requires au niveau de l'application. Les dépendances au niveau de l'application seront toujours installées ; les dépendances spécifiques à la plate-forme sont installées en plus de celles au niveau de l'application.

Une fois que vous avez ajouté la nouvelle exigence, enregistrez pyproject.toml et exécutez briefcase dev -r. Le drapeau -r indique à Briefcase que les exigences ont changé et que l'environnement virtuel de développement doit être mis à jour :

(beeware-venv) $ briefcase dev -r

[helloworld] Activation de l'environnement de développement...
...
Recréation de l'environnement virtuel (dev.cpython-313-darwin)... terminé

[hello-world] Installation des dépendances...
...

[helloworld] Démarrage en mode développement...
===========================================================================

Lorsque vous entrez un nom et que vous appuyez sur le bouton, une boîte de dialogue doit s'afficher :

Tutoriel Hello World 7 dialogue, sur macOS

(beeware-venv) $ briefcase dev -r

[helloworld] Activation de l'environnement de développement...
...
Recréation de l'environnement virtuel (dev.cpython-313-x86_64-linux-gnu)... terminée

[hello-world] Installation des dépendances...
...

[helloworld] Démarrage en mode dev...
===========================================================================

Lorsque vous entrez un nom et que vous appuyez sur le bouton, une boîte de dialogue doit s'afficher :

Tutoriel Hello World 7 dialogue, sur Linux

(beeware-venv) C:\...>briefcase dev -r

[helloworld] Activation de l'environnement de développement...
...
Recréation de l'environnement virtuel (dev.cp313-win_amd64)... terminée

[hello-world] Installation des prérequis...
...

[helloworld] Démarrage en mode dev...
===========================================================================

Lorsque vous entrez un nom et que vous appuyez sur le bouton, une boîte de dialogue doit s'afficher :

Tutoriel Hello World 7 dialogue, sur Windows

Vous ne pouvez pas exécuter une application Android en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Vous ne pouvez pas exécuter une application iOS en mode développeur - utilisez les instructions pour la plateforme de bureau que vous avez choisie.

Erreurs possibles lors de l'exécution de « briefcase dev »

Si vous obtenez toujours une erreur lors de l'exécution de briefcase dev, assurez-vous que :

  1. Vous avez ajouté faker à la liste requires dans pyproject.toml ;
  2. Vous avez enregistré vos modifications dans pyproject.toml ; et
  3. Vous avez inclus l'argument -r lors de l'exécution de briefcase dev -r.

La toute première fois que vous exécutez votre application à l'aide de briefcase dev, l'argument -r est automatiquement ajouté pour vous. C'est pourquoi nous n'avons pas eu à utiliser l'argument -r jusqu'à présent. L'argument -r n'est nécessaire que lorsque vous ajoutez, supprimez ou modifiez une exigence, après avoir exécuté votre application en mode développement. Si vous avez uniquement mis à jour le code, vous pouvez exécuter briefcase dev comme nous l'avons fait tout au long de ce tutoriel.

Exécution de l'application mise à jour

Nous disposons désormais d'une application fonctionnelle, utilisant une bibliothèque tierce, qui s'exécute en mode développement. Intégrons ce code d'application mis à jour dans une application autonome. Étant donné que nous avons apporté des modifications au code, nous devons suivre les mêmes étapes que dans le Tutoriel 4 :

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update

[helloworld] Mise à jour du code de l'application...
...

[helloworld] Application mise à jour.

Reconstruire l'application :

(beeware-venv) $ briefcase build

[helloworld] Application de signature ad hoc...
[helloworld] Fichier « build/helloworld/macos/app/Hello World.app » créé

Enfin, lancez l'application :

(beeware-venv) $ briefcase run

[helloworld] Démarrage de l'application...
===========================================================================

Cependant, lorsque l'application s'exécute, vous verrez une erreur dans la console, ainsi qu'une boîte de dialogue de plantage :

Plantage de l'application Hello World Tutorial 7, sur macOS

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update

[helloworld] Mise à jour du code de l'application...
...

[helloworld] Application mise à jour.

Reconstruire l'application :

(beeware-venv) $ briefcase build

[helloworld] Finalisation de la configuration de l'application...
...

[helloworld] Compilation de l'application...
...

[helloworld] Compilation terminée : build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

Enfin, lancez l'application :

(beeware-venv) $ briefcase run

[helloworld] Démarrage de l'application...
===========================================================================

Cependant, lorsque l'application s'exécute, une erreur apparaît dans la console :

Traceback (dernier appel en dernier) :
  Fichier « /usr/lib/python3.13/runpy.py », ligne 194, dans _run_module_as_main
    return _run_code(code, main_globals, None,
  Fichier « /usr/lib/python3.13/runpy.py », ligne 87, dans _run_code
    exec(code, run_globals)
  Fichier "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py", ligne 1, dans <module>
    from helloworld.app import main
  Fichier « /home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py », ligne 8, dans <module>
    import faker
ModuleNotFoundError : Aucun module nommé « faker »

Impossible de démarrer l'application helloworld.

Mettre à jour le code dans l'application packagée :

(beeware-venv) C:\...>briefcase update

[helloworld] Mise à jour du code de l'application...
...

[helloworld] Application mise à jour.

Reconstruire l'application :

(beeware-venv) C:\...>briefcase build
...

[helloworld] Compilation de build\helloworld\windows\app\src\Toga Test.exe

Enfin, lancez l'application :

(beeware-venv) C:\...>briefcase run

[helloworld] Démarrage de l'application...
===========================================================================

Cependant, lorsque l'application s'exécute, vous verrez une erreur dans la console, ainsi qu'une boîte de dialogue de plantage :

Plantage de l'application Hello World Tutorial 7, sur Windows

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update android

[helloworld] Mise à jour du code de l'application...
...

[helloworld] Application mise à jour.

Reconstruire l'application :

(beeware-venv) $ briefcase build android

[helloworld] Mise à jour des métadonnées de l'application...
...
[helloworld] Compilation terminée : build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk

Enfin, exécutez l'application (en sélectionnant un simulateur lorsque vous y êtes invité) :

(beeware-venv) $ briefcase run android

[helloworld] Voici le journal de l'appareil (appuyez sur CTRL-C pour arrêter l'affichage)...
===========================================================================

Cependant, lorsque l'application s'exécute, une erreur apparaît dans la console :

--------- Début du plantage
E/AndroidRuntime : EXCEPTION FATALE : main
E/AndroidRuntime : Processus : com.example.helloworld, PID : 8289
E/AndroidRuntime : java.lang.RuntimeException : Impossible de démarrer l'activité ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity} : com.chaquo.python.PyException : ModuleNotFoundError : Aucun module nommé « faker »
E/AndroidRuntime :   à android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime :   à android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime :   dans android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime :   dans android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime :   dans android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime :   à android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime :   à android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime :   à android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime :   à android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime :   à android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime :   à java.lang.reflect.Method.invoke(méthode native)
E/AndroidRuntime :   à com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime :   à com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime : Causé par : com.chaquo.python.PyException : ModuleNotFoundError : Aucun module nommé « faker »
E/AndroidRuntime :   à <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime :   à <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime :   à <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime :   à <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime :   à <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime :   à <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime :   à <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime :   à <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime :   à com.chaquo.python.PyObject.callAttrThrowsNative(méthode native)
E/AndroidRuntime :   à com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime :   à com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime :   à org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime :   à android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime :   à android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime :   à android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime :   à android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime :   ... 12 autres
I/Process : Envoi d'un signal. PID : 8289 SIG : 9

Mettre à jour le code dans l'application packagée :

(beeware-venv) $ briefcase update iOS

[helloworld] Mise à jour du code de l'application...
...

[helloworld] Application mise à jour.

Reconstruire l'application :

(beeware-venv) $ briefcase build iOS

[helloworld] Mise à jour des métadonnées de l'application...
...
[helloworld] Application « build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app » créée

Enfin, exécutez l'application (en sélectionnant un simulateur lorsque vous y êtes invité) :

(beeware-venv) $ briefcase run iOS

...
[helloworld] Voici le journal du simulateur (appuyez sur CTRL-C pour arrêter l'affichage)...
===========================================================================

Cependant, lorsque l'application s'exécute, une erreur apparaît dans la console

L'application s'est bloquée !
========================
Traceback (dernier appel en dernier) :
  Fichier "/Users/rkm/Library/Developer/CoreSimulator/Devices/FD7EA28A-6D72-4064-9D8A-53CC8308BB6F/data/Containers/Bundle/Application/D9DD590B-DA32-4EE1-8F78-78658379CAB7/Hello World.app/app/helloworld/__main__.py", ligne 1, dans <module>
    from helloworld.app import main
  Fichier "/Users/rkm/Library/Developer/CoreSimulator/Devices/FD7EA28A-6D72-4064-9D8A-53CC8308BB6F/data/Containers/Bundle/Application/D9DD590B-DA32-4EE1-8F78-78658379CAB7/Hello World.app/app/helloworld/app.py", ligne 8, dans <module>
    import faker
ModuleNotFoundError : Aucun module nommé « faker »

Une fois de plus, l'application n'a pas démarré parce que faker n'a pas été installé - mais pourquoi ? N'avons-nous pas déjà installé faker ?

Oui, mais uniquement dans l'environnement de développement. Chaque application créée dispose également de son propre environnement autonome, qui est l'un des éléments générés par Briefcase lorsque vous exécutez briefcase build. Lorsque nous avons exécuté briefcase dev -r, nous avons ajouté faker à notre environnement de développement, mais pas à l'application packagée. Nous devons également exécuter briefcase update -r afin que Briefcase sache que les exigences de l'application packagée ont changé :

(beeware-venv) $ briefcase update -r

[helloworld] Mise à jour du code de l'application...
Installation de src/hello_world...

[helloworld] Mise à jour des dépendances...
Collecte de faker
  Utilisation de faker-37.3.0-py3-none-any.whl.metadata mis en cache (15 ko)
...
Installation des paquets collectés : tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Installation réussie de faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1 et tzdata-2025.2

[helloworld] Suppression du contenu inutile de l'application...
...

[helloworld] Application mise à jour.
(beeware-venv) $ briefcase update -r

[helloworld] Finalisation de la configuration de l'application...
Cible : ubuntu:jammy (base Debian du fournisseur)
Détermination de la version de glibc... terminé
Cible : glibc 2.35
Cible : Python 3.13

[helloworld] Mise à jour du code de l'application...
Installation de src/hello_world...

[helloworld] Mise à jour des dépendances...
Collecte de faker
  Utilisation de faker-37.3.0-py3-none-any.whl.metadata mis en cache (15 ko)
...
Installation des paquets collectés : tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Installation réussie de faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1 et tzdata-2025.2

[helloworld] Suppression du contenu inutile de l'application...
...

[helloworld] Application mise à jour.
(beeware-venv) C:\...>briefcase update -r

[helloworld] Mise à jour du code de l'application...
Installation de src/helloworld...

[helloworld] Mise à jour des dépendances...
Collecte de faker
  Utilisation de faker-37.3.0-py3-none-any.whl.metadata mis en cache (15 ko)
...
Installation des paquets collectés : tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Installation réussie de faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1 et tzdata-2025.2

[helloworld] Suppression du contenu inutile de l'application...
...

[helloworld] Application mise à jour.
(beeware-venv) $ briefcase update android -r

[helloworld] Mise à jour du code de l'application...
Installation de src/helloworld... terminée

[helloworld] Mise à jour des dépendances...
Écriture du fichier de dépendances... terminé

[helloworld] Suppression du contenu inutile de l'application...
Suppression du contenu inutile du bundle de l'application... terminé

[helloworld] Application mise à jour.
(beeware-venv) $ briefcase update iOS -r

[helloworld] Mise à jour du code de l'application...
Installation de src/helloworld... terminée

[helloworld] Mise à jour des dépendances...
Recherche dans les index : https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Collecte de faker
  Utilisation de faker-37.4.0-py3-none-any.whl.metadata mis en cache (15 ko)
...

Installation des dépendances de l'application pour le simulateur iPhone... terminé

[helloworld] Suppression du contenu inutile de l'application...
Suppression du contenu inutile du bundle de l'application... terminé

[helloworld] Application mise à jour.

Une fois la mise à jour effectuée, vous pouvez lancer briefcase build et briefcase run - et vous devriez voir votre application packagée, avec le nouveau comportement du dialogue.

Note

L'option -r pour la mise à jour des exigences est également honorée par les commandes build et run, donc si vous voulez mettre à jour, compiler et exécuter en une seule étape, vous pouvez utiliser briefcase run -u -r.

Paquets Python tiers pour les mobiles et le Web

Faker n'est qu'un exemple de paquetage Python tiers - une collection de code qui ne fait pas partie de ce que Python fournit en standard. Ces paquets tiers sont le plus souvent distribués via le Python Package Index (PyPI), et installés dans votre environnement virtuel local. Nous avons utilisé pip dans ce tutoriel, mais il existe d'autres options.

Sur les plateformes de bureau (macOS, Windows, Linux), pratiquement tous les paquets disponibles sur PyPI peuvent être installés dans votre environnement virtuel ou ajoutés aux exigences de votre application. Cependant, lorsque vous développez une application pour des plateformes mobiles ou web, vos options sont légèrement limitées.

En bref, tout paquetage purement Python (c'est-à-dire tout paquetage créé à partir d'un projet écrit uniquement en Python) peut être utilisé sans difficulté. Certains paquets, cependant, sont créés à partir de projets contenant à la fois Python et d'autres langages (par exemple C, C++, Rust, etc.). Le code écrit dans ces langages doit être compilé en modules binaires spécifiques à la plateforme avant de pouvoir être utilisé, et ces modules binaires précompilés ne sont disponibles que sur des plateformes spécifiques. Les plateformes mobiles et web ont des exigences très différentes de celles des plateformes de bureau "standard". À l'heure actuelle, la plupart des paquets Python ne fournissent pas de binaires précompilés pour les plateformes mobiles et web.

Sur PyPI, les paquets sont souvent fournis dans un format de distribution préconstruit appelé wheels. Pour vérifier si un paquet est purement Python, regardez la page de téléchargements PyPI pour le projet. Si les roues fournies ont un suffixe -py3-none-any.whl (par exemple, Faker), alors ce sont des roues purement Python. Cependant, si les roues ont des extensions spécifiques à la version et à la plateforme (par exemple, Pillow, qui a des roues avec des suffixes comme -cp313-cp313-macosx_11_0_arm64.whl et -cp39-cp39-win_amd64.whl), alors la roue contient un composant binaire. Ce paquet ne peut pas être installé sur des plateformes mobiles ou web à moins qu'une roue compatible avec ces plateformes n'ait été fournie.

A l'heure actuelle, la plupart des paquets binaires sur PyPI ne fournissent pas de roues compatibles avec les mobiles ou le web. Pour combler cette lacune, BeeWare fournit des binaires pour certains modules binaires populaires (y compris numpy, pandas, et cryptography). Ces roues ne sont pas distribuées sur PyPI, mais Briefcase les installera si elles sont disponibles.

Il est habituellement possible de compiler des paquets binaires pour les plateformes mobiles, mais ce n'est pas facile à mettre en place – ce qui sort du cadre d'un tutoriel d'introduction comme celui-ci.

Étapes suivantes

Nous avons maintenant une application qui utilise une bibliothèque tierce ! Dans le Tutoriel 8, nous apprendrons à nous assurer que notre application reste réactive lorsque nous ajoutons une logique d'application plus complexe.