Portable Programmierung mit Python

Python ist zwar eine portable Programmiersprache, erfordert aber dennoch die Einhaltung verschiedener Konventionen, um eine portable Programmierung mit Python zu gewährleisten.

Portablem Programmierung mit Python bedeutet: Ein Python-Programm kann auf allen Betriebssystemen ausgeführt werden, auf denen ein entsprechender Python-Interpreter installiert ist, unabhängig davon, unter welchem Betriebssystem das Programm erstellt wurde. Du musst Python auf Deinem Computer installiert haben, um Python-Programme erstellen und ausführen zu können. Wie Du Python installierst, erfährst Du im Beitrag „Python installieren“. Die Installation unterscheidet sich je nach Betriebssystem.

Auch bei der Ausführung von Python-Programmen gibt es Unterschiede zwischen den Betriebssystemen. Wenn Du diese bereits bei der Programmierung beachtest, werden Deine Programme portabel, unabhängig von Betriebssystem und/oder Hardware, ausführbar sein. Die einzige Voraussetzung ist dann das Vorhandenseins eines Python-Interpreters, der hinsichtlich seiner Version den Mindestanforderungen genügen muss, die Dein Programm stellt.

Im Folgenden erläutere ich Dir die Konventionen, die Du für eine portable Programmierung mit Python zu beachten hast. Außerdem zeige ich Dir, wie Du die Laufzeitumgebung Deines Betriebssystems einstellen solltest, damit Du von falsch dargestellten Umlauten und ähnlichen Ärgernissen verschont bleibst.

Aufrufkonventionen

Der erste wichtige Unterschied zwischen den Betriebssystemen betrifft den Aufruf von Python. Unter Microsoft Windows lautet er python, bei macOS und Gnu/Linux python3.

Nehmen wir an, wir hätten ein Python-Programm namens helloworld.py. Du hast ein Terminal-Programm geöffnet und befindest Dich im Verzeichnis, in welchem das Programm gespeichert ist.

Expliziter Interpreter-Aufruf

Die erste Möglichkeit, ein Python-Programm auszuführen, besteht darin, den Python-Interpreter aufzurufen und ihm Pfad und Name des auszuführenden Python-Skripts als Kommandozeilenargument mitzugeben.

Unter Microsoft Windows rufst Du das Programm wie folgt zur Ausführung auf:

C:\> python helloworld.py

Der Eingabeprompt mag bei Dir anders gestaltet sein.

Unter macOS und Gnu/Linux lautet der Programmaufruf wie folgt:

$ python3 helloworld.py

Auch hier mag sich Dein Eingabeprompt vom dem hier dargestellten Prompt unterscheiden.

Impliziter Interpreter-Aufruf

Du kannst auf den expliziten Interpreter-Aufruf verzichten, wenn die entsprechenden Voraussetzungen vorhanden sind.

C:\> helloworld.py

Unter Microsoft Windows ist der Python-Interpreter mit der Dateiendung .py assoziiert, wenn Du Python korrekt installiert und an der Datei-Assoziation keine Änderungen vorgenommen hast. Es reicht dann, das Python-Skript alleinig aufzurufen. Der Interpreter wird automatisch, implizit, von Windows gestartet.

Unter macOS und Gnu/Linux funktioniert das so nicht. Du musst den Interpreter angeben und Ausführungsberechtigungen setzen.

Interpreterangabe

Unter macOS und Gnu/Linux führt die aktive Shell eine Skript-Datei aus. Das heißt, dass sie Skript-Code erwartet, den sie interpretieren kann. Python versteht sie jedoch nicht. Deshalb ist, ganz analog zu anderen Skripten, in der ersten Zeile eines Skripts, der zu verwendende Interpreter anzugeben. Für Python-Skripten lautet diese „magische Zeile“:

#!/usr/bin/env/ python3

Auch als Programmierer, der unter Microsoft Windows arbeitet, solltest Du diese Zeile angeben. Unter Microsoft Windows wird sie ignoriert. Sie stellt aber sicher, dass Deine Programme auch dann noch den Python-Interpreter finden, wenn Du sie an einen Anwender weitergibst, der kein Windows verwendet.

Ausführungsberechtigungen

Die Angabe des Interpreters ist unter macOS und Gnu/Linux nicht hinreichend. Diese Betriebssysteme machen die Ausführbarkeit einer Datei nicht an deren Dateiendung fest. Ausschlaggebend sind die Berechtigungen, die eine Datei hat. Eine Datei muss ausführungsberechtigt sein, um ausgeführt werden zu können. Das ist Aufgabe des Anwenders, der Dein Programm ausführen möchte.

Die Berechtigungen einer Datei lassen sich sehr detailliert festlegen. Im einfachsten Fall gewährst Du allen, also Gott und der Welt, Ausführungsberechtigung für das Programm.

$ chmod +x helloworld.py

Wenn Du restriktiver vorgehen möchtest, sieh Dir die Dokumentation zu chmod an. Den Dateinamen Deiner Programmdatei passt Sie selbstredend den Gegebenheiten an.

Sodann kannst Du Dein Python-Skript direkt aufrufen und ausführen. In der Regel gehört das aktuelle Verzeichnis nicht zum Suchpfad für ausführbare Programme. Wenn Du also im Verzeichnis der Programmdatei stehst, musst Du eine relative Pfadangabe voranstellen.

$ ./helloworld.py

Hast Du auch die beiden folgenden Aspekte, Zeichensatz- und Zeilenende-Kodierung, beachtet, dann läuft Dein Programm perfekt.

Zeichensatz-Kodierung

Python arbeitet standardmäßig mit der Zeichensatz-Kodierung UTF-8. Das ist eine Kodierung, die viele internationale Zeichen kodiert und, sofern die entsprechenden Glyphen in den installierten Schriften vorhanden sind, auch schön und korrekt darstellt. Bei der UTF-8-Kodierung können Zeichen mit einem oder mit bis zu vier Byte kodiert sein. Bei macOS und Gnu/Linux ist UTF-8 standardmäßig eingerichtet und die Vorgabe für Editoren und andere Werkzeuge.

Unter Microsoft Windows ist UTF-8 nicht standardmäßig eingestellt. Es herrscht vielmehr ein gewisser Wildwuchs an Zeichensatz-Kodierungen. Im Terminal (Eingabeaufforderung, TerminalApp) ist bei deutschen Windows-Versionen die Codepage 850 eingestellt. Die grafische Benutzeroberfläche verwendet die Codepage 1252. Beide Codepages stellen Zeichensatz-Kodierungen dar, die jeweils mit einem 1-Byte-Zeichensatz arbeiten. Obgleich sind sich in Details unterscheiden, haben sie eines gemeinsam: Sie verwenden für die Kodierung eines Zeichen jeweils nur ein Byte, was nicht kompatibel zu UTF-8 ist. Dennoch gibt es Programme unter Windows, die per Voreinstellung auch UTF-8 nutzen. – Ein Mischmasch eben.

Als Python-Programmierer musst Du darauf achten, einen Editor zur Erfassung Deiner Programmcodes zu verwenden, der es Dir ermöglicht, Deine Dateien in UTF-8 zu speichern. Sollte das nicht voreingestellt sein, so stelle diese Kodierung ein.

Nur bei korrekter Zeichensatz-Kodierung werden Umlaute bei der Programmausführung korrekt darstellt.

Anmerkung: Bietet Dein Editor keine Option, die Zeichensatz-Kodierung korrekt einzustellen, dann kannst Du die verwendete in Deinem Python-Skript in der zweiten Zeile angeben.

# -*- coding: latin-1 -*-

Es ist guter Stil, diese Angabe auch dann zu machen, wenn Du UTF-8 verwendest. Die Zeile lautet dann:

# -*- coding: utf8 -*-

Welche Kodierungen der Python-Interpreter akzeptiert erfährst Du in dessen Dokumentation. Ist die korrekte Kodierung im Skript angegeben, behandelt der Python-Interpreter sie auch richtig.

Zeilenende-Kodierung

Einer der übelsten Fehler, den Du machen kannst, ist eine fehlerhafte Zeilenende-Kodierung. Der Fehler ist übel, weil ein möglicherweise unerfahrener Programmierer nicht damit rechnet. Die meisten Editoren unter Microsoft Windows verwenden zwei Zeichen zur Kennzeichnung eines Zeilenendes: Carriage Return plus Line Feed. Unter macOS und Gnu/Linux wird ein Zeilenende lediglich durch einen Line Feed gekennzeichnet.

Wurde eine Python-Skriptdatei mit Carriage Return und Line Feed als Zeilenende-Kennung gespeichert, findet die ausführende Shell unter macOS und Gnu/Linux den Python-Interpreter nicht, wenn Du die Datei ohne expliziten Interpreter-Aufruf ausführen möchtest. Du bekommst dann eine Fehlermedlung. Die besagt, dass die Datei python3\r nicht gefunden werden konnte. \r ist dabei die symbolische Darstellung für Carriage Return. Achte deshalb darauf, Deinen Editor, Deine Entwicklungsumgebung, entsprechend eingestellt zu haben. Oft heißt die Option auch Unix-Zeilenenden verwenden.

Der mit Windows mitgelieferte Editor Notepad besitzt leider keine entsprechende Option, weshalb er für die portable Python-Programmierung ungeeignet ist. Selbst spezialisierte Entwicklungsumgebungen, wie beispielsweise PyCharm, sind, so meine Erfahrung, falsch vorkonfiguriert.

Zusätzliche Fallstricke unter Microsoft Windows

Für macOS- und Gnu/Linux-Anwender ist die Welt in Ordnung, wenn das oben Gesagte beachtet wurde. Bei Windows gibt es, aufgrund der verschiedenen Zeichensatz-Kodierungen, die das Betriebssystem nicht konsistent verwendet, weitere Aspekte zu beachten.

Die Windows-Terminal-Anwendungen verwenden im Standard kein UTF-8. Stelle dies mithilfe des chcp-Kommandos ein. Die Codepage heißt hier 65001.

C:\> chcp 65001
Aktive Codepage: 65001.

Leider geht diese Einstellung teilweise verloren, wenn Du Umlenkungen oder Pipes verwendest. Das Betriebssystem verwendet dann intern wieder die Codepage 850, was für fehlerhafte Umlaute und Sonderzeichen sorgt. Setze daher auch die Umgebungsvariable PYTHONIOENCODING.

C:\> set PYTHONIOENCODING=utf8

Um diese Einstellungen nicht stets manuell und wiederholt vornehmen zu müssen, empfehle ich Dir, die Umgebungsvariable PYTHONIOENCODING in der Systemsteuerung, bei den Umgebungsvariablen, zu definieren. Die Codepage sollte nicht global definiert werden. Ich habe mir daher in der Terminal-App von Windows 11 eine eigene Konfiguration erstellt. In der setze ich die Codepage auf 65001, wenn ich die entsprechende Konfiguration, die bei mir Python-Terminal heißt, wähle.

Python Windows Terminal-App
Python-Konfiguration in der Windows-TerminalApp

Zusätzlich empfehle ich Dir, wenn Du mein Tutorial durcharbeitest und Windows-Anwender bist, nicht die PowerShell zu verwenden. Im Tutorial arbeite ich mit Ein-/Ausgabeumleitungen und Pipes. Eingabeumleitungen werden von der PowerShell nicht unterstützt.

Hinweis: Die für die Terminal-App von Windows 11 gezeigte Einstellung der Codepage lässt sich analog auch für die Eingabeaufforderung von Windows 10 einrichten.

Portable Python-Programmierung – Zusammenfassung

Beachtest Du  das oben Erläuterte, so ist die portable Python-Programmierung kein Buch mit sieben Siegeln. Es sind ein paar Konventionen zu beachten und gegebenenfalls auch Konfigurationen an der Betriebssystemumgebung vorzunehmen, um Python sorgenfrei nutzen zu können. Diese Dinge machst Du aber nur einmalig, wenn Du vernünftig bist, sodass dies kaum als großer Akt zu bezeichnen ist. In Deinen Programmen beherzige den Aufbau, grundsätzlich die zwei „magischen Zeilen“ im Programmcode zu notieren, die ich Dir hier nochmals zeige. Hast Du dann noch Deine Entwicklungsumgebung auf die richtige Kodierung von Zeichensatz und Zeilenenden eingestellt, kannst Du sicher sein, mit Python problemlos plattformunabhängige Programme schreiben und ausführen zu können.

#!/usr/bin/env/python3
# -*- encoding: utf8 -*-

print("Python mit korrekten Umlauten: äöüÄöÜ und ß")

Hinweis: Als erfahrener Programmierer wist Du die erste Zeile gelegentlich weglassen oder auch anders formulieren. Wann das sinnvoll ist, erfährst Du im Tutorial.

Schreibe einen Kommentar