29 Schnittstelle zu Betriebssystem und Laufzeitumgebung 

Um Ihre Programme mit dem Betriebssystem interagieren zu lassen, auf dem sie ausgeführt werden, benötigen Sie Zugriff auf dessen Funktionen. Ein Problem dabei ist, dass sich die verschiedenen Betriebssysteme teilweise sehr stark in ihrem Funktionsumfang und in der Art unterscheiden, wie die vorhandenen Operationen verwendet werden. Python wurde aber von Grund auf als plattformübergreifende Sprache konzipiert. Um auch Programme, die auf Funktionen des Betriebssystems zurückgreifen müssen, auf möglichst vielen Plattformen ohne Änderungen ausführen zu können, hat man eine Schnittstelle geschaffen, die einheitlichen Zugriff auf Betriebssystemfunktionen bietet. Im Klartext bedeutet dies, dass Sie durch die Benutzung dieser einheitlichen Schnittstelle Programme schreiben können, die plattformunabhängig bleiben, selbst wenn sie auf Betriebssystemfunktionen zurückgreifen.
Diese Schnittstelle wird durch die Module os und sys implementiert, mit denen wir uns in den nächsten Abschnitten beschäftigen werden.
29.1 Funktionen des Betriebssystems – os 

Mit dem os-Modul können Sie auf eine Vielzahl von Betriebssystemoperationen zugreifen. Da die gebotenen Funktionen sehr umfangreich sind und zu einem großen Teil nur selten gebraucht werden, beschränken wir uns hier auf eine nützliche Teilmenge.
Das Modul os beinhaltet einige Funktionen, die sich auf das Dateisystem beziehen, sowie das Submodul os.path für die Manipulation und Verarbeitung von Pfadnamen. Dies wird Thema der Abschnitte 31.1 und 31.2 in Kapitel 31, »Dateisystem«, sein.
Das Modul os hat eine eigene Exception-Klasse namens os.error. Immer wenn Sie Fehler innerhalb dieses Moduls abfangen möchten, können Sie os.error nutzen. Ein alternativer Name für die Fehlerklasse ist OSError.
[»] Hinweis
Seit Python 3.0 wird streng zwischen Text und Daten durch die Datentypen str und bytes unterschieden, wie Sie in Kapitel 13, »Sequenzielle Datentypen«, gelernt haben. Alle Methoden und Funktionen, die von os bereitgestellt werden und str-Objekte als Parameter akzeptieren, können stattdessen auch mit bytes-Objekten gerufen werden. Allerdings ändert sich damit auch der Rückgabewert entsprechend, denn anstelle von Strings werden dann bytes-Objekte zurückgegeben.
Kurz: str rein – str raus; bytes rein – bytes raus.
Um die folgenden Beispielprogramme ausführen zu können, muss zunächst das Modul os eingebunden werden:
>>> import os
29.1.1 environ 

Enthält ein Dictionary, mit dem auf die Umgebungsvariablen, die für unser Programm vom Betriebssystem bereitgestellt wurden, zugegriffen werden kann. Beispielsweise lässt sich auf vielen Plattformen mit os.environ['HOME'] der Ordner für die Dateien des aktiven Benutzers ermitteln. Die folgenden Beispiele zeigen den Wert von os.environ['HOME'] auf einem Windows- und einem Linux-Rechner:
>>> print(os.environ['HOME'])
C:\Dokumente und Einstellungen\username
>>> print(os.environ['HOME'])
/home/username
Sie können die Werte des os.environ-Dictionarys auch verändern, was allerdings auf bestimmten Plattformen zu Problemen führen kann und deshalb mit Vorsicht zu genießen ist.
29.1.2 getpid() 

Der Python-Prozess, der das aktuell laufende Programm ausführt, hat eine eindeutige Identifikationsnummer. Sie lässt sich mit os.getpid() ermitteln:
>>> os.getpid()
1360
Diese Funktion ist nur unter Windows- und Unix-Systemen verfügbar.
29.1.3 cpu_count() 

Gibt die Anzahl der Prozessoren des Computers zurück. Dabei werden virtuelle Kerne als eigene Prozessoren gezählt.
>>> os.cpu_count()
8
Das System, auf dem diese Zeile ausgeführt wurde, verfügt beispielsweise über einen Prozessor mit vier Kernen, die jeweils zwei virtuelle Kerne haben.
29.1.4 system(cmd) 

Mit os.system können Sie beliebige Kommandos des Betriebssystems so ausführen, als ob Sie es in einer echten Konsole tun würden. Beispielsweise lassen wir uns mit folgendem Beispiel einen neuen Ordner mit dem Namen test_ordner über das mkdir-Kommando anlegen:
>>> os.system("mkdir test_ordner")
0
Der Rückgabewert von os.system ist der Status-Code, mit dem das aufgerufene Programm beendet wurde, in diesem Fall 0, was Erfolg bedeutet.
Ein Problem der os.system-Funktion ist, dass die Ausgabe des aufgerufenen Programms nicht ohne Weiteres ermittelt werden kann. Für solche Zwecke eignet sich die Funktion os.popen.
29.1.5 popen(command, [mode, buffering]) 

Mit der Funktion os.popen werden beliebige Befehle wie auf einer Kommandozeile des Betriebssystems ausgeführt. Die Funktion gibt ein dateiähnliches Objekt[ 121 ](Ein dateiähnliches Objekt bietet die gleiche Schnittstelle wie ein Dateiobjekt an. Die Daten müssen jedoch nicht in einer Datei gelesen werden, sondern können beispielsweise auch im Arbeitsspeicher liegen oder über eine Netzwerkverbindung gelesen werden. ) zurück, mit dem Sie auf die Ausgabe des ausgeführten Programms zurückgreifen können. Der Parameter mode gibt wie bei der Built-in Function open an, ob das Dateiobjekt lesend ("r") oder schreibend ("w") geöffnet werden soll. Bei schreibendem Zugriff können Daten an das laufende Programm übergeben werden.
Im folgenden Beispiel nutzen wir das Windows-Kommando dir, um eine Liste der Dateien und Ordner unter C:\ zu erzeugen:[ 122 ](Der Parameter /B des dir-Kommandos sorgt dafür, dass nur eine Liste der Dateien und Verzeichnisse ohne Zusatzinformationen erzeugt wird. )
>>> ausgabe = os.popen("dir /B C:\\")
>>> dateien = [zeile.strip() for zeile in ausgabe]
>>> dateien
['AUTOEXEC.BAT', 'CONFIG.SYS', 'Dokumente und Einstellungen', 'Programme',
'WINDOWS']
Die genaue Bedeutung von mode und buffering können Sie in Abschnitt 6.4.1 über den Umgang mit Dateien nachlesen.
[»] Hinweis
Das Modul os stellt eine Reihe von Funktionen zur Verfügung, mit denen auf das Dateisystem zugegriffen werden kann, die wir in Abschnitt 31.1, »Zugriff auf das Dateisystem mit os«, besprechen.