Tutorial 7 – Starten Sie diese (Dritt-)Anwendung¶
Bisher hat die von uns entwickelte App nur unseren eigenen Code sowie den von BeeWare bereitgestellten Code verwendet. In einer realen App werden Sie jedoch wahrscheinlich eine Bibliothek eines Drittanbieters verwenden wollen, die Sie aus dem Python Package Index (PyPI) herunterladen können.
Lassen Sie uns unsere App so ändern, dass sie eine Bibliothek eines Drittanbieters enthält.
Paket hinzufügen¶
Lassen Sie uns unsere Anwendung so ändern, dass sie etwas mehr sagt als nur „Hallo!“.
Um einen interessanteren Text für das Dialogfeld zu erzeugen, werden wir eine Bibliothek namens Faker verwenden. Faker ist ein Python-Paket, das gefälschte Inhalte, einschließlich Namen und Textblöcke, erzeugt. Die Namen und Wörter in den Textblöcken werden aus einer beliebigen Liste von Wörtern generiert, die von Faker bereitgestellt wird. Wir werden Faker verwenden, um eine gefälschte Nachricht zu erstellen, als ob jemand dem Benutzer antwortet.
Fügen wir einen httpx-API-Aufruf zu unserer Anwendung hinzu. Fügen Sie einen
Import am Anfang der app.py hinzu, um httpx zu importieren:
import faker
Dann ändern Sie den Callback say_hello() so, dass er wie folgt aussieht:
async def say_hello(self, widget):
fake = faker.Faker()
await self.main_window.dialog(
toga.InfoDialog(
greeting(self.name_input.value),
f"A message from {fake.name()}: {fake.text()}",
)
)
Führen wir unsere aktualisierte Anwendung im Briefcase-Entwicklermodus aus, um zu prüfen, ob unsere Änderung funktioniert.
(beeware-venv) $ briefcase dev
Traceback (most recent call last):
File ".../venv/bin/briefcase", line 5, in <module>
from briefcase.__main__ import main
File ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", line 3, in <module>
from .cmdline import parse_cmdline
File ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", line 6, in <module>
from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", line 1, in <module>
from .build import BuildCommand # noqa
File ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", line 5, in <module>
from .base import BaseCommand, full_options
File ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", line 14, in <module>
import faker
ModuleNotFoundError: No module named 'faker'
(beeware-venv) $ briefcase dev
Traceback (most recent call last):
File ".../venv/bin/briefcase", line 5, in <module>
from briefcase.__main__ import main
File ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", line 3, in <module>
from .cmdline import parse_cmdline
File ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", line 6, in <module>
from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", line 1, in <module>
from .build import BuildCommand # noqa
File ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", line 5, in <module>
from .base import BaseCommand, full_options
File ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", line 14, in <module>
import faker
ModuleNotFoundError: No module named 'faker'
(beeware-venv) C:\...>briefcase dev
Traceback (most recent call last):
File "...\venv\bin\briefcase", line 5, in <module>
from briefcase.__main__ import main
File "...\venv\lib\python3.13\site-packages\briefcase\__main__.py", line 3, in <module>
from .cmdline import parse_cmdline
File "...\venv\lib\python3.13\site-packages\briefcase\cmdline.py", line 6, in <module>
from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
File "...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py", line 1, in <module>
from .build import BuildCommand # noqa
File "...\venv\lib\python3.13\site-packages\briefcase\commands\build.py", line 5, in <module>
from .base import BaseCommand, full_options
File "...\venv\lib\python3.13\site-packages\briefcase\commands\base.py", line 14, in <module>
import faker
ModuleNotFoundError: No module named 'faker'
Sie können eine Android-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Sie können eine iOS-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Was ist passiert? Wir haben faker zu unserem Code hinzugefügt, aber nicht
zur virtuellen Umgebung, die zum Ausführen der App im Entwicklungsmodus
verwendet wird.
Wenn Briefcase eine App im Entwicklungsmodus ausführt, erstellt es eine
eigenständige virtuelle Umgebung für diese Anwendung, unabhängig von der
Umgebung, in der Sie briefcase ausführen. Wenn Ihre App nicht angibt, dass sie
eine bestimmte Bibliothek benötigt, wird diese Bibliothek nicht in der
virtuellen Entwicklungsumgebung installiert.
Wie fügen Sie Ihrer Anwendung eine neue Anforderung hinzu?
Aktualisieren von Abhängigkeiten¶
Im Hauptverzeichnis Ihrer Anwendung befindet sich eine Datei namens
pyproject.toml. Diese Datei enthält alle Konfigurationsdetails der Anwendung,
die Sie beim Ausführen von briefcase new angegeben haben.
pyproject.toml ist in Abschnitte unterteilt; einer der Abschnitte beschreibt
die Einstellungen für Ihre Anwendung:
[tool.briefcase.app.helloworld]
formal_name = "Hello World"
description = "A Tutorial app"
long_description = """More details about the app should go here.
"""
sources = ["src/helloworld"]
requires = []
Die Option requires beschreibt die Abhängigkeiten unserer Anwendung. Es
handelt sich um eine Liste von Zeichenfolgen, in der Bibliotheken (und optional
auch Versionen von Bibliotheken) angegeben sind, die Sie in Ihre App aufnehmen
möchten.
Ändern Sie die Einstellung requires so, dass sie lautet:
requires = [
"faker",
]
Durch Hinzufügen dieser Einstellung teilen wir Briefcase mit: "Wenn du meine
Anwendung baust, führe pip install httpx in das Anwendungsbündel ein". Alles,
was eine legale Eingabe für pip install wäre, kann hier verwendet werden - Sie
könnten also angeben:
- Eine bestimmte Bibliotheksversion (z.B.
"httpx==0.19.0"); - Eine Reihe von Bibliotheksversionen (z.B.
"httpx>=0.19"); - Ein Pfad zu einem Git-Repository (z. B.
"git+https://github.com/encode/httpx"); oder - Ein lokaler Dateipfad (Aber Achtung: Wenn Sie Ihren Code an jemand anderen weitergeben, existiert dieser Pfad wahrscheinlich nicht auf dessen Rechner!)
Weiter unten in pyproject.toml werden Sie andere Abschnitte bemerken, die vom
Betriebssystem abhängig sind, wie [tool.briefcase.app.helloworld.macOS] und
[tool.briefcase.app.helloworld.windows]. Diese Abschnitte haben auch eine
requires Einstellung. Diese Einstellungen erlauben es Ihnen, zusätzliche
plattformspezifische Abhängigkeiten zu definieren - wenn Sie also zum Beispiel
eine plattformspezifische Bibliothek benötigen, um einen Aspekt Ihrer Anwendung
zu behandeln, können Sie diese Bibliothek im plattformspezifischen
requires-Abschnitt angeben, und diese Einstellung wird nur für diese Plattform
verwendet. Sie werden feststellen, dass die toga-Bibliotheken alle im
plattformspezifischen requires-Abschnitt angegeben sind - das liegt daran,
dass die Bibliotheken, die für die Anzeige einer Benutzeroberfläche benötigt
werden, plattformspezifisch sind.
In unserem Fall wollen wir, dass httpx auf allen Plattformen installiert wird,
also verwenden wir die Einstellung requires auf Anwendungsebene. Die
Abhängigkeiten auf Anwendungsebene werden immer installiert; die
plattformspezifischen Abhängigkeiten werden zusätzlich zu den Abhängigkeiten
auf Anwendungsebene installiert.
Nachdem Sie die neue Anforderung hinzugefügt haben, speichern Sie
pyproject.toml und führen Sie briefcase dev -r aus. Das Flag -r teilt
Briefcase mit, dass sich die Anforderungen geändert haben und die virtuelle
Entwicklungsumgebung aktualisiert werden muss:
(beeware-venv) $ briefcase dev -r
[helloworld] Activating dev environment...
...
Recreating virtual environment (dev.cpython-313-darwin)... done
[hello-world] Installing requirements...
...
[helloworld] Starting in dev mode...
===========================================================================
Wenn Sie einen Namen eingeben und auf die Schaltfläche klicken, sollte ein Dialogfeld angezeigt werden, das in etwa wie folgt aussieht:

(beeware-venv) $ briefcase dev -r
[helloworld] Activating dev environment...
...
Recreating virtual environment (dev.cpython-313-x86_64-linux-gnu)... done
[hello-world] Installing requirements...
...
[helloworld] Starting in dev mode...
===========================================================================
Wenn Sie einen Namen eingeben und auf die Schaltfläche klicken, sollte ein Dialogfeld angezeigt werden, das in etwa wie folgt aussieht:

(beeware-venv) C:\...>briefcase dev -r
[helloworld] Activating dev environment...
...
Recreating virtual environment (dev.cp313-win_amd64)... done
[hello-world] Installing requirements...
...
[helloworld] Starting in dev mode...
===========================================================================
Wenn Sie einen Namen eingeben und auf die Schaltfläche klicken, sollte ein Dialogfeld angezeigt werden, das in etwa wie folgt aussieht:

Sie können eine Android-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Sie können eine iOS-App nicht im Entwicklermodus ausführen – befolgen Sie die Anweisungen für die von Ihnen gewählte Desktop-Plattform.
Mögliche Fehler beim Ausführen von „briefcase dev“
Wenn beim Ausführen von briefcase dev weiterhin eine Fehlermeldung angezeigt
wird, stellen Sie Folgendes sicher:
- Sie haben
fakerzur Listerequiresinpyproject.tomlhinzugefügt. - Sie haben Ihre Änderungen in
pyproject.tomlgespeichert und - Sie haben das Argument
-rbeim Ausführen vonbriefcase dev -rangegeben.
Wenn Sie Ihre App zum ersten Mal mit briefcase dev ausführen, wird das
Argument -r automatisch hinzugefügt – deshalb mussten wir das Argument -r
bisher nicht verwenden. Das Argument -r wird nur benötigt, wenn Sie eine
Anforderung hinzufügen, entfernen oder ändern, nachdem Sie Ihre Anwendung im
Entwicklungsmodus ausgeführt haben. Wenn Sie nur den Code aktualisiert haben,
können Sie briefcase dev wie bisher in diesem Tutorial ausführen.
Ausführen der aktualisierten Anwendung¶
Wir haben jetzt eine funktionierende App, die eine Bibliothek eines Drittanbieters verwendet und im Entwicklungsmodus läuft. Packen wir diesen aktualisierten Anwendungscode als eigenständige App. Da wir Codeänderungen vorgenommen haben, müssen wir die gleichen Schritte wie in Tutorial 4 befolgen:
Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update
[helloworld] Updating application code...
...
[helloworld] Application updated.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build
[helloworld] Adhoc signing app...
[helloworld] Built build/helloworld/macos/app/Hello World.app
Und schließlich führen Sie die Anwendung aus:
(beeware-venv) $ briefcase run
[helloworld] Starting app...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler und ein Absturzdialog angezeigt:

Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update
[helloworld] Updating application code...
...
[helloworld] Application updated.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build
[helloworld] Finalizing application configuration...
...
[helloworld] Building application...
...
[helloworld] Built build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld
Und schließlich führen Sie die Anwendung aus:
(beeware-venv) $ briefcase run
[helloworld] Starting app...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler angezeigt:
Traceback (most recent call last):
File "/usr/lib/python3.13/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.13/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py", line 1, in <module>
from helloworld.app import main
File "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py", line 8, in <module>
import faker
ModuleNotFoundError: No module named 'faker'
Unable to start app helloworld.
Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) C:\...>briefcase update
[helloworld] Updating application code...
...
[helloworld] Application updated.
Bauen Sie die Anwendung neu auf:
(beeware-venv) C:\...>briefcase build
...
[helloworld] Built build\helloworld\windows\app\src\Toga Test.exe
Und schließlich führen Sie die Anwendung aus:
(beeware-venv) C:\...>briefcase run
[helloworld] Starting app...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler und ein Absturzdialog angezeigt:

Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update android
[helloworld] Updating application code...
...
[helloworld] Application updated.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build android
[helloworld] Updating app metadata...
...
[helloworld] Built build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk
Und schließlich starten Sie die App (wählen Sie einen Simulator aus, wenn Sie dazu aufgefordert werden):
(beeware-venv) $ briefcase run android
[helloworld] Following device log output (type CTRL-C to stop log)...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler angezeigt:
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: Process: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity}: com.chaquo.python.PyException: ModuleNotFoundError: No module named 'faker'
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Caused by: com.chaquo.python.PyException: ModuleNotFoundError: No module named 'faker'
E/AndroidRuntime: at <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime: at <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime: at <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime: at <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime: at <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime: at <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime: at <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime: at <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime: at com.chaquo.python.PyObject.callAttrThrowsNative(Native Method)
E/AndroidRuntime: at com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime: at com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime: at org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime: ... 12 more
I/Process : Sending signal. PID: 8289 SIG: 9
Aktualisieren Sie den Code in der gepackten Anwendung:
(beeware-venv) $ briefcase update iOS
[helloworld] Updating application code...
...
[helloworld] Application updated.
Bauen Sie die Anwendung neu auf:
(beeware-venv) $ briefcase build iOS
[helloworld] Updating app metadata...
...
[helloworld] Built build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app
Und schließlich starten Sie die App (wählen Sie einen Simulator aus, wenn Sie dazu aufgefordert werden):
(beeware-venv) $ briefcase run iOS
...
[helloworld] Following simulator log output (type CTRL-C to stop log)...
===========================================================================
Wenn die Anwendung jedoch ausgeführt wird, wird in der Konsole ein Fehler angezeigt:
Application has crashed!
========================
Traceback (most recent call last):
File "/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", line 1, in <module>
from helloworld.app import main
File "/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", line 8, in <module>
import faker
ModuleNotFoundError: No module named 'faker'
Wieder einmal konnte die App nicht gestartet werden, weil faker nicht
installiert wurde - aber warum? Haben wir faker nicht schon installiert?
Wir haben es – aber nur in der Entwicklungsumgebung. Jede erstellte Anwendung
verfügt auch über eine eigene eigenständige Umgebung, die Briefcase erstellt,
wenn Sie briefcase build ausführen. Als wir briefcase dev -r ausgeführt
haben, haben wir faker zu unserer Entwicklungsumgebung hinzugefügt, aber
nicht zur gepackten App. Wir müssen auch briefcase update -r ausführen, damit
Briefcase weiß, dass sich die Anforderungen der gepackten App geändert haben:
(beeware-venv) $ briefcase update -r
[helloworld] Updating application code...
Installing src/hello_world...
[helloworld] Updating requirements...
Collecting faker
Using cached faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installing collected packages: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Successfully installed 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 tzdata-2025.2
[helloworld] Removing unneeded app content...
...
[helloworld] Application updated.
(beeware-venv) $ briefcase update -r
[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.13
[helloworld] Updating application code...
Installing src/hello_world...
[helloworld] Updating requirements...
Collecting faker
Using cached faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installing collected packages: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Successfully installed 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 tzdata-2025.2
[helloworld] Removing unneeded app content...
...
[helloworld] Application updated.
(beeware-venv) C:\...>briefcase update -r
[helloworld] Updating application code...
Installing src/helloworld...
[helloworld] Updating requirements...
Collecting faker
Using cached faker-37.3.0-py3-none-any.whl.metadata (15 kB)
...
Installing collected packages: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Successfully installed 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 tzdata-2025.2
[helloworld] Removing unneeded app content...
...
[helloworld] Application updated.
(beeware-venv) $ briefcase update android -r
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Updating requirements...
Writing requirements file... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
(beeware-venv) $ briefcase update iOS -r
[helloworld] Updating application code...
Installing src/helloworld... done
[helloworld] Updating requirements...
Looking in indexes: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Collecting faker
Using cached faker-37.4.0-py3-none-any.whl.metadata (15 kB)
...
Installing app requirements for iPhone simulator... done
[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done
[helloworld] Application updated.
Sobald Sie das Update durchgeführt haben, können Sie briefcase build und
briefcase run ausführen - und Sie sollten Ihre gepackte Anwendung mit dem
neuen Dialogverhalten sehen.
Hinweis
Die Option -r zum Aktualisieren der Anforderungen wird auch von den Befehlen
build und run beachtet. Wenn Sie also in einem Schritt aktualisieren, bauen
und ausführen wollen, können Sie briefcase run -u -r verwenden.
Python-Pakete von Drittanbietern für Mobilgeräte und das Web¶
Faker ist nur ein Beispiel für ein Python-Paket eines Drittanbieters – eine
Sammlung von Code, der nicht Teil der Standardausstattung von Python ist. Diese
Pakete von Drittanbietern werden meist über den Python Package Index
(PyPI) verteilt und in Ihrer lokalen virtuellen Umgebung
installiert. In diesem Tutorial haben wir pip verwendet, aber es gibt auch
andere Optionen.
Auf Desktop-Plattformen (macOS, Windows, Linux) kann jede pip-Installation zu
Ihren Anforderungen hinzugefügt werden. Auf mobilen und Web-Plattformen sind
Ihre Möglichkeiten etwas
eingeschränkt.
Kurz gesagt: Jedes reine Python-Paket (d. h. jedes Paket, das aus einem ausschließlich in Python geschriebenen Projekt erstellt wurde) kann ohne Probleme verwendet werden. Einige Pakete werden jedoch aus Projekten erstellt, die sowohl Python als auch andere Sprachen (z. B. C, C++, Rust usw.) enthalten. Code, der in diesen Sprachen geschrieben wurde, muss vor der Verwendung zu plattformspezifischen Binärmodulen kompiliert werden, und diese vorkompilierten Binärmodule sind nur auf bestimmten Plattformen verfügbar. Mobile und Web-Plattformen haben ganz andere Anforderungen als „Standard“-Desktop-Plattformen. Derzeit bieten die meisten Python-Pakete keine vorkompilierten Binärdateien für mobile und Web-Plattformen an.
Auf PyPI werden Pakete oft in einem vorgefertigten Distributionsformat namens
wheels bereitgestellt. Um zu überprüfen, ob ein Paket reines Python ist,
schauen Sie auf der PyPI-Downloadseite für das Projekt nach. Wenn die
bereitgestellten Wheels die Endung -py3-none-any.whl haben (z. B.
Faker), dann handelt es sich um
reine Python-Wheels. Wenn die Wheels jedoch versions- und plattformspezifische
Erweiterungen haben (z. B.
Pillow, das Wheels mit Suffixen
wie -cp313-cp313-macosx_11_0_arm64.whl und -cp39-cp39-win_amd64.whl hat),
dann enthält das Wheel eine binäre Komponente. Dieses Paket kann nicht auf
mobilen oder Web-Plattformen installiert werden, es sei denn, es wurde ein mit
diesen Plattformen kompatibles Wheel bereitgestellt.
Derzeit bieten die meisten Binärpakete auf PyPI keine mobil- oder webfähigen
Wheels an. Um diese Lücke zu schließen, stellt BeeWare Binärdateien für einige
beliebte Binärmodule (einschließlich numpy, pandas und cryptography) zur
Verfügung. Diese Wheels werden nicht auf PyPI verteilt, aber Briefcase
installiert sie, sofern sie verfügbar sind.
BeeWare kann Binärdateien für einige beliebte Binärmodule (einschließlich
numpy, pandas und cryptography) bereitstellen. Es ist normalerweise
möglich, Pakete für mobile Plattformen zu kompilieren, aber es ist nicht einfach
einzurichten - das würde den Rahmen eines einführenden Tutorials wie diesem
sprengen.
Nächste Schritte¶
Wir haben jetzt eine App, die eine Bibliothek eines Drittanbieters verwendet! In Tutorial 8 lernen wir, wie wir sicherstellen können, dass unsere App auch dann reaktionsschnell bleibt, wenn wir komplexere Anwendungslogik hinzufügen.