5. Python unter macOS verwenden
*******************************

Dieses Dokument gibt einen Überblick über das macOS-spezifische
Verhalten, das du kennen solltest, um mit Python auf Mac-Rechnern
anzufangen. Python auf einem Mac unter macOS ist dem Python auf
anderen unixartigen Plattformen sehr ähnlich, bei der Installation und
bei einigen Funktionen gibt es aber Unterschiede.

Es gibt verschiedene Wege, Python für macOS zu beziehen und zu
installieren. Vorgefertigte Fassungen der neuesten Python-Versionen
bieten mehrere Distributoren an. Dieses Dokument beschreibt
überwiegend die Verwendung der Pythons, die das CPython-
Veröffentlichungsteam auf der Webseite python.org zum Herunterladen
bereitstellt. Einige andere Möglichkeiten stehen unter Alternative
Distributionen.


5.1. Python für macOS von "python.org" verwenden
================================================


5.1.1. Installationsschritte
----------------------------

Für aktuelle Python-Versionen (außer denen im Zustand "security")
erstellt das Veröffentlichungsteam zu jeder neuen Veröffentlichung ein
Installationspaket **Python for macOS**. Eine Liste der verfügbaren
Installationsprogramme steht auf der macOS-Downloadseite. Wir
empfehlen, wo möglich die neueste unterstützte Python-Version zu
verwenden. Die aktuellen Installationsprogramme liefern einen Build
als universal2-Binärdatei, der auf allen Macs (Apple Silicon und
Intel) nativ läuft, die von einer breiten Reihe von macOS-Versionen
unterstützt werden — derzeit üblicherweise ab mindestens **macOS 10.15
Catalina**.

Die heruntergeladene Datei ist ein gewöhnliches macOS-
Installationspaket (".pkg"). Angaben zur Unversehrtheit der Datei
(etwa Prüfsumme, Größe und Sigstore-Signatur) stehen für jede Datei
auf der Downloadseite der Veröffentlichung. Installationspakete und
ihr Inhalt sind mit Apple-Developer-ID-Zertifikaten der "Python
Software Foundation" signiert und notarisiert, um die Anforderungen
von macOS Gatekeeper zu erfüllen.

Für eine Standardinstallation doppelklicke auf die heruntergeladene
Installationspaketdatei. Damit sollte das übliche
Installationsprogramm von macOS starten und den ersten von mehreren
Installationsschritten anzeigen.

[Bild]

Ein Klick auf **Fortfahren** bringt die Datei **Bitte lesen** dieses
Installationsprogramms zum Vorschein. Neben anderen wichtigen
Hinweisen dokumentiert **Bitte lesen**, welche Python-Version
installiert wird und auf welchen macOS-Versionen sie unterstützt ist.
Möglicherweise musst du blättern, um die ganze Datei zu lesen.
Standardmäßig wird dieses **Bitte lesen** auch in
"/Applications/Python 3.15/" installiert und ist jederzeit
nachzulesen.

[Bild]

Ein Klick auf **Fortfahren** zeigt als Nächstes die Lizenz für Python
und für weitere mitgelieferte Software an. Du musst den
Lizenzbedingungen dann mit **Akzeptieren** zustimmen, bevor es zum
nächsten Schritt weitergeht. Auch diese Lizenzdatei wird installiert
und lässt sich später nachlesen.

[Bild]

Nachdem die Lizenzbedingungen angenommen sind, folgt die Anzeige
**Installationstyp**. Für die meisten Zwecke ist der übliche Satz von
Installationsschritten passend.

[Bild]

Mit der Schaltfläche **Anpassen** kannst du einzelne Paketbestandteile
des Installationsprogramms weglassen oder auswählen. Klicke auf einen
Paketnamen, um eine Beschreibung dessen zu sehen, was er installiert.
Zur optionalen Free-Threading-Funktion, die standardmäßig installiert
wird, siehe Free-Threading-Binärdateien installieren.

[Bild]

In beiden Fällen beginnt ein Klick auf **Installieren** den
Installationsvorgang und fragt um Erlaubnis, neue Software zu
installieren. Dazu ist ein macOS-Benutzername mit
"Administrator"-Recht nötig, denn das installierte Python steht allen
Benutzern des Macs zur Verfügung.

Ist die Installation abgeschlossen, erscheint das Fenster
**Zusammenfassung**.

[Bild]

Doppelklicke auf das Symbol beziehungsweise die Datei **Install
Certificates.command** im Fenster "/Applications/Python 3.15/", um die
Installation abzuschließen.

[Bild]

Damit öffnet sich ein vorübergehendes Fenster der Shell **Terminal**,
das mit dem neuen Python SSL-Wurzelzertifikate für dessen Verwendung
herunterlädt und installiert.

[Bild]

Erscheinen "Successfully installed certifi" und "update complete" im
Terminalfenster, ist die Installation abgeschlossen. Schließe dieses
Terminalfenster und das Fenster des Installationsprogramms.

Eine Standardinstallation umfasst:

* Einen Ordner "Python 3.15" in deinem Ordner "Applications". Darin
  findest du **IDLE**, die Entwicklungsumgebung, die zum festen
  Bestand der offiziellen Python-Distributionen gehört, sowie **Python
  Launcher**, der das Doppelklicken von Python-Skripten im Finder von
  macOS behandelt.

* Ein Framework "/Library/Frameworks/Python.framework", das die
  ausführbare Python-Datei und die Bibliotheken enthält. Das
  Installationsprogramm fügt diesen Ort deinem Shell-Pfad hinzu. Um
  Python zu deinstallieren, kannst du diese drei Dinge entfernen.
  Symbolische Verknüpfungen auf die ausführbare Python-Datei liegen in
  "/usr/local/bin/".

Bemerkung:

  Neuere macOS-Versionen enthalten einen Befehl **python3** in
  "/usr/bin/python3", der auf eine meist ältere und unvollständige
  Python-Version verweist, die von den Apple-Entwicklungswerkzeugen
  **Xcode** beziehungsweise den **Command Line Tools for Xcode**
  mitgebracht und für diese verwendet wird. Du solltest diese
  Installation niemals verändern oder zu löschen versuchen, denn sie
  wird von Apple verwaltet und von Software von Apple und von Dritten
  verwendet. Wenn du eine neuere Python-Version von "python.org"
  installierst, hast du zwei verschiedene, aber funktionierende
  Python-Installationen auf deinem Rechner, die nebeneinander bestehen
  können. Die Standardoptionen des Installationsprogramms sollten
  sicherstellen, dass dessen **python3** anstelle des
  System-**python3** verwendet wird.


5.1.2. Wie man ein Python-Skript ausführt
-----------------------------------------

Es gibt zwei Wege, den Python-Interpreter aufzurufen. Wenn du mit
einer Unix-Shell in einem Terminalfenster vertraut bist, kannst du
"python3.15" oder "python3" aufrufen, wahlweise gefolgt von einer oder
mehreren Befehlszeilenoptionen (beschrieben unter Befehlszeile und
Umgebung). Das Python-Tutorial hat außerdem einen nützlichen Abschnitt
darüber, Python interaktiv aus einer Shell zu verwenden.

Du kannst den Interpreter auch über eine integrierte
Entwicklungsumgebung aufrufen. IDLE --- Python editor and shell ist
eine einfache Editor- und Interpreterumgebung, die zur
Standarddistribution von Python gehört. **IDLE** hat ein Hilfemenü,
über das du die Python-Dokumentation erreichst. Wenn Python für dich
völlig neu ist, kannst du dort die Einführung des Tutorials lesen.

Es gibt viele weitere Editoren und Entwicklungsumgebungen, mehr dazu
unter Editoren und IDEs.

Um eine Python-Skriptdatei aus dem Terminalfenster auszuführen, kannst
du den Interpreter mit dem Namen der Skriptdatei aufrufen:

   "python3.15" "myscript.py"

Um dein Skript aus dem Finder auszuführen, hast du zwei Möglichkeiten:

* Zieh es auf **Python Launcher**.

* Wähle **Python Launcher** über das Informationsfenster des Finders
  als Standardanwendung zum Öffnen deines Skripts (oder jedes
  ".py"-Skripts) und doppelklicke darauf. **Python Launcher** hat
  mehrere Einstellungen, mit denen sich steuern lässt, wie dein Skript
  gestartet wird. Mit gedrückter Wahltaste ziehen erlaubt dir, diese
  für einen einzelnen Aufruf zu ändern, oder du änderst sie über sein
  Menü "Preferences" grundsätzlich.

Sei dir bewusst, dass ein Skript, das du direkt aus dem Finder von
macOS startest, andere Ergebnisse liefern kann als aus einem
Terminalfenster, denn es läuft dann nicht in der üblichen Shell-
Umgebung, einschließlich aller Umgebungsvariablen aus den Shell-
Profilen. Und wie bei jedem anderen Skript oder Programm: sei dir
sicher, was du gerade ausführst.


5.2. Alternative Distributionen
===============================

Neben dem üblichen Installationsprogramm von "python.org" für macOS
gibt es Distributionen von Dritten für macOS, die zusätzliche
Funktionen enthalten können. Einige verbreitete Distributionen und
ihre wichtigsten Eigenschaften:

ActivePython
   Installationsprogramm mit plattformübergreifender Verträglichkeit,
   Dokumentation

Anaconda
   Verbreitete wissenschaftliche Module (etwa numpy, scipy und pandas)
   und der Paketmanager "conda".

Homebrew
   Paketmanager für macOS, der mehrere Python-Versionen und viele auf
   Python aufbauende Pakete von Dritten umfasst (darunter numpy, scipy
   und pandas).

MacPorts
   Ein weiterer Paketmanager für macOS, der mehrere Python-Versionen
   und viele auf Python aufbauende Pakete von Dritten umfasst. Enthält
   möglicherweise vorgefertigte Python-Fassungen und viele Pakete für
   ältere macOS-Versionen.

Beachte, dass die Distributionen nicht die neuesten Versionen von
Python oder anderen Bibliotheken enthalten müssen und nicht vom Kern-
Team von Python gepflegt oder unterstützt werden.


5.3. Zusätzliche Python-Pakete installieren
===========================================

Mehr dazu im Python Packaging User Guide.


5.4. GUI-Programmierung
=======================

Für das Bauen von GUI-Anwendungen auf dem Mac mit Python gibt es
mehrere Möglichkeiten.

Das Standard-GUI-Toolkit von Python ist "tkinter", das auf dem
plattformübergreifenden Tk-Toolkit aufbaut (https://www.tcl.tk). Eine
macOS-native Fassung von Tk liegt dem Installationsprogramm bei.

*PyObjC* ist eine Python-Anbindung an Apples Objective-C/Cocoa-
Framework. Angaben zu PyObjC stehen unter pyobjc.

Es gibt mehrere alternative GUI-Toolkits für macOS, darunter:

* PySide: Offizielle Python-Anbindungen an das Qt-GUI-Toolkit.

* PyQt: Alternative Python-Anbindungen an Qt.

* Kivy: Ein plattformübergreifendes GUI-Toolkit, das Desktop- und
  Mobilplattformen unterstützt.

* Toga: Teil des BeeWare Project, unterstützt Desktop-, Mobil-, Web-
  und Konsolenanwendungen.

* wxPython: Ein plattformübergreifendes Toolkit, das Desktop-
  Betriebssysteme unterstützt.


5.5. Fortgeschrittene Themen
============================


5.5.1. Free-Threading-Binärdateien installieren
-----------------------------------------------

Added in version 3.13.

Geändert in Version 3.15: Die Unterstützung für Free-Threading wird
jetzt standardmäßig installiert.

Das Installationspaket Python for macOS von "python.org" installiert
standardmäßig einen zusätzlichen Build von Python 3.15, der *free
threading* unterstützt (Betrieb mit abgeschaltetem *global interpreter
lock*). Mögliche aktuellere Hinweise stehen auf der
Veröffentlichungsseite auf "python.org".

Der Free-Threading-Betrieb funktioniert und wird weiter verbessert,
bei Arbeitslasten mit nur einem Thread gibt es gegenüber dem
gewöhnlichen Build aber etwas Mehraufwand. Außerdem sind Pakete von
Dritten, besonders solche mit einem *extension module*, möglicherweise
noch nicht für die Verwendung in einem Free-Threading-Build bereit und
schalten den *GIL* wieder ein. Seit Python 3.15 wird die Free-
Threading-Unterstützung standardmäßig installiert. Sie ist als eigene
Installationsoption verpackt, die sich über die Schaltfläche
**Anpassen** im Schritt **Installationstyp** des
Installationsprogramms abwählen lässt, wie oben beschrieben.

[Bild]

Ist das Kästchen neben dem Paketnamen **Free-threaded Python**
angekreuzt (was standardmäßig der Fall ist), wird neben dem
gewöhnlichen "Python.framework" in "/Library/Frameworks" zusätzlich
ein eigenes "PythonT.framework" installiert. Dieser Aufbau erlaubt es,
einen Free-Threading-Build von Python 3.15 mit geringem Risiko neben
einem herkömmlichen Build (nur mit GIL) von Python 3.15 auf deinem
System bestehen zu lassen, während du installierst oder testest.
Dieser Installationsaufbau kann sich in künftigen Veröffentlichungen
ändern.

Bekannte Einschränkungen und Vorsichtshinweise:

* Das Paket **UNIX command-line tools**, das standardmäßig ausgewählt
  ist, legt in "/usr/local/bin" Verknüpfungen für "python3.15t", den
  Free-Threading-Interpreter, und "python3.15t-config" an, ein
  Konfigurationshilfsmittel, das für Paketbauer nützlich sein kann. Da
  "/usr/local/bin" üblicherweise in deinem Shell-"PATH" enthalten ist,
  sollten in den meisten Fällen keine Änderungen an deiner
  Umgebungsvariablen "PATH" nötig sein, um "python3.15t" zu verwenden.

* In dieser Veröffentlichung unterstützen das Paket **Shell profile
  updater** und die Datei "Update Shell Profile.command" in
  "/Applications/Python 3.15/" das Free-Threading-Paket nicht.

* Der Free-Threading-Build und der herkömmliche Build haben getrennte
  Suchpfade und getrennte Verzeichnisse "site-packages". Wenn du ein
  Paket also in beiden Builds brauchst, muss es standardmäßig
  möglicherweise in beiden installiert werden. Das Free-Threading-
  Paket installiert eine eigene Instanz von **pip** für die Verwendung
  mit "python3.15t".

  * Um ein Paket mit **pip** ohne **venv** zu installieren:

       python3.15t -m pip install <package_name>

* Wenn du mit mehreren Python-Umgebungen arbeitest, ist es meist am
  sichersten und einfachsten, virtuelle Umgebungen anzulegen und zu
  verwenden. Das vermeidet mögliche Namenskonflikte bei Befehlen und
  Unklarheit darüber, welches Python gerade verwendet wird:

     python3.15t -m venv <venv_name>

  dann **activate**.

* Um eine Free-Threading-Fassung von IDLE auszuführen:

     python3.15t -m idlelib

* Die Interpreter beider Builds reagieren auf dieselben PYTHON-
  Umgebungsvariablen, was zu unerwarteten Ergebnissen führen kann,
  etwa wenn du "PYTHONPATH" in einem Shell-Profil gesetzt hast. Bei
  Bedarf gibt es Befehlszeilenoptionen wie "-E", um diese
  Umgebungsvariablen zu ignorieren.

* Der Free-Threading-Build linkt gegen die gemeinsam genutzten
  Bibliotheken von Dritten, etwa "OpenSSL" und "Tk", die im
  herkömmlichen Framework installiert sind. Das heißt, beide Builds
  teilen auch einen Satz Vertrauenszertifikate, wie ihn das Skript
  **Install Certificates.command** installiert — es muss daher nur
  einmal ausgeführt werden.

* Wenn du dich nicht darauf verlassen kannst, dass die Verknüpfung in
  "/usr/local/bin" auf das Free-Threading-"python3.15t" von
  "python.org" zeigt (etwa weil du dort deine eigene Fassung
  installieren möchtest oder eine andere Distribution das tut), kannst
  du deine Shell-Umgebungsvariable "PATH" ausdrücklich so setzen, dass
  sie das Verzeichnis "bin" des "PythonT"-Frameworks einschließt:

     export PATH="/Library/Frameworks/PythonT.framework/Versions/3.15/bin":"$PATH"

  Die herkömmliche Framework-Installation macht standardmäßig etwas
  Ähnliches, nur mit "Python.framework". Bedenke, dass beide
  Framework-Verzeichnisse "bin" in "PATH" zu Verwirrung führen können,
  wenn es in beiden gleiche Namen wie "python3.15" gibt — welcher dann
  tatsächlich verwendet wird, hängt von der Reihenfolge in "PATH" ab.
  Die Befehle "which python3.x" beziehungsweise "which python3.xt"
  zeigen, welcher Pfad verwendet wird. Virtuelle Umgebungen helfen,
  solche Unklarheiten zu vermeiden. Eine andere Möglichkeit wäre ein
  Shell-**alias** auf den gewünschten Interpreter, etwa:

     alias py3.15="/Library/Frameworks/Python.framework/Versions/3.15/bin/python3.15"
     alias py3.15t="/Library/Frameworks/PythonT.framework/Versions/3.15/bin/python3.15t"


5.5.2. Über die Befehlszeile installieren
-----------------------------------------

Wenn du das Installationspaket von "python.org" automatisiert
installieren möchtest (statt über die gewohnte macOS-Anwendung
**Installer**), kannst du mit dem macOS-Befehlszeilenwerkzeug
**installer** auch Optionen abseits der Vorgaben wählen. Wenn du
**installer** nicht kennst, kann es etwas kryptisch wirken (mehr dazu
unter **man installer**). Der folgende Shell-Auszug zeigt beispielhaft
einen Weg, und zwar mit der Veröffentlichung "3.15.0b2" und
abgewählter Option für den Free-Threading-Interpreter:

   RELEASE="python-3.150b2-macos11.pkg"

   # download installer pkg
   curl -O https://www.python.org/ftp/python/3.15.0/${RELEASE}

   # create installer choicechanges to customize the install:
   #    disable the PythonTFramework-3.15 package
   #    while accepting the other defaults (install all other packages)
   cat > ./choicechanges.plist <<EOF
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
   <plist version="1.0">
   <array>
           <dict>
                   <key>attributeSetting</key>
                   <integer>0</integer>
                   <key>choiceAttribute</key>
                   <string>selected</string>
                   <key>choiceIdentifier</key>
                   <string>org.python.Python.PythonTFramework-3.15</string>
           </dict>
   </array>
   </plist>
   EOF

   sudo installer -pkg ./${RELEASE} -applyChoiceChangesXML ./choicechanges.plist -target /

Nach einer Standardinstallation kannst du so prüfen, dass beide Builds
verfügbar sind:

   $ # test that the free-threaded interpreter was installed if the Unix Command Tools package was enabled
   $ /usr/local/bin/python3.15t -VV
   Python 3.15.0b2 free-threading build (v3.15.0b2:3a83b172af, Jun  5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)]
   $ #    and the traditional interpreter
   $ /usr/local/bin/python3.15 -VV
   Python 3.15.0b2 (v3.15.0b2:3a83b172af, Jun  5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)]
   $ # test that they are also available without the prefix if /usr/local/bin is on $PATH
   $ python3.15t -VV
   Python 3.15.0b2 free-threading build (v3.15.0b2:3a83b172af, Jun  5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)]
   $ python3.15 -VV
   Python 3.15.0b2 (v3.15.0b2:3a83b172af, Jun  5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)]

Bemerkung:

  Die aktuellen Installationsprogramme von "python.org" installieren
  nur an feste Orte wie "/Library/Frameworks/", "/Applications" und
  "/usr/local/bin". Die Option "-domain" von **installer** lässt sich
  nicht verwenden, um an andere Orte zu installieren.


5.5.3. Python-Anwendungen weitergeben
-------------------------------------

Es gibt eine Reihe von Werkzeugen, die deinen Python-Code in eine
eigenständige, weitergebbare Anwendung verwandeln:

* py2app: Unterstützt das Erzeugen von macOS-".app"-Bündeln aus einem
  Python-Projekt.

* Briefcase: Teil des BeeWare Project, ein plattformübergreifendes
  Paketierwerkzeug, das das Erzeugen von ".app"-Bündeln unter macOS
  unterstützt und auch Signieren und Notarisieren übernimmt.

* PyInstaller: Ein plattformübergreifendes Paketierwerkzeug, das eine
  einzelne Datei oder einen Ordner als weitergebbares Erzeugnis
  erstellt.


5.5.4. Vorgaben des App Store erfüllen
--------------------------------------

Anwendungen, die zur Weitergabe über den macOS App Store eingereicht
werden, müssen Apples App-Prüfverfahren durchlaufen. Dieses Verfahren
umfasst eine Reihe automatischer Prüfregeln, die das eingereichte
Anwendungsbündel auf bedenklichen Code untersuchen.

Die Python-Standardbibliothek enthält Code, von dem bekannt ist, dass
er gegen diese automatischen Regeln verstößt. Diese Verstöße scheinen
zwar Fehlalarme zu sein, Apples Prüfregeln lassen sich aber nicht
anfechten. Deshalb ist es nötig, die Python-Standardbibliothek zu
verändern, damit eine Anwendung die Prüfung des App Store besteht.

Der Python-Quellbaum enthält eine Patch-Datei, die allen Code
entfernt, von dem bekannt ist, dass er im Prüfverfahren des App Store
Schwierigkeiten macht. Dieser Patch wird automatisch angewandt, wenn
CPython mit der Option "--with-app-store-compliance" konfiguriert
wird.

Dieser Patch ist für die Verwendung von CPython auf einem Mac
normalerweise nicht erforderlich, und er ist auch nicht erforderlich,
wenn du eine Anwendung *außerhalb* des macOS App Store weitergibst. Er
ist *nur* dann erforderlich, wenn du den macOS App Store als
Vertriebsweg nutzt.


5.6. Weitere Quellen
====================

Die Hilfeseite von python.org verweist auf viele nützliche Quellen.
Die Mailingliste Pythonmac-SIG ist eine weitere Unterstützungsquelle
speziell für Python-Anwender und -Entwickler auf dem Mac.
