Umgebungsvariablen können in Python-Programmen mit os.environ abgerufen, überprüft, gesetzt (hinzugefügt oder überschrieben) und gelöscht werden. Beachten Sie, dass Änderungen, die durch das Setzen oder Löschen von Umgebungsvariablen vorgenommen werden, nur innerhalb des Python-Programms wirksam sind. Das bedeutet nicht, dass die Umgebungsvariablen des Systems neu geschrieben werden.
Hier finden Sie die folgenden Informationen.
os.environ
- Umgebungsvariablen abrufen.
- Umgebungsvariablen setzen (überschreiben)
- Umgebungsvariablen entfernen
- Auswirkungen veränderter Umweltvariablen
- Umschalten von Prozessen durch Umgebungsvariablen
Importieren und verwenden Sie das os-Modul. Da es sich um eine Standardbibliothek handelt, ist keine zusätzliche Installation erforderlich. Das Modul subprocess ist ebenfalls in der Standardbibliothek enthalten.
import os
import subprocess
os.environ
Der Typ von os.environ ist os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ ist ein Objekt vom Typ map mit einem Paar aus Schlüssel und Wert und verfügt über die gleichen Methoden wie ein Wörterbuch (Typ dict). Der Name der Umgebungsvariablen ist key und ihr Wert ist value.
Der Inhalt von os.environ wird geladen, wenn das os-Modul importiert wird. Der Inhalt von os.environ wird auch dann nicht aktualisiert, wenn die Systemumgebungsvariablen auf andere Weise geändert werden, während das Programm läuft.
Die Liste wird mit print() angezeigt.
# print(os.environ)
Wie beim Wörterbuch können Sie die folgenden Methoden verwenden oder mit in auf das Vorhandensein von Schlüsseln und Werten prüfen.
keys()
values()
Die Verarbeitung von Schlüsseln und Werten ist grundsätzlich dieselbe wie bei Wörterbüchern. Im Folgenden werden Beispiele gegeben.
Umgebungsvariablen abrufen.
os.environ[Environment variable name]
Auf diese Weise können Sie den Wert der Umgebungsvariablen abrufen, aber wenn Sie einen Namen für eine Umgebungsvariable angeben, der nicht existiert, erhalten Sie einen Fehler (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Die Methode get() von os.environ kann verwendet werden, um den Standardwert zu erhalten, wenn er nicht existiert. Dies ist auch dasselbe wie das Wörterbuch.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Die Funktion os.getenv() ist ebenfalls vorhanden. Wie die Methode get() des Wörterbuchs gibt sie den Standardwert zurück, wenn der Schlüssel nicht existiert. Diese Funktion ist nützlich, wenn Sie nur den Wert einer Umgebungsvariablen abrufen und überprüfen wollen.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Umgebungsvariablen setzen (überschreiben)
os.environ[Environment variable name]
Durch Zuweisung eines Wertes können Sie eine Umgebungsvariable setzen.
Wenn ein neuer Umgebungsvariablenname angegeben wird, wird die Umgebungsvariable neu hinzugefügt, und wenn ein vorhandener Umgebungsvariablenname angegeben wird, wird der Wert der Umgebungsvariable überschrieben.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Beachten Sie, dass die Zuweisung eines anderen Wertes als einer Zeichenkette zu einem Fehler führt (TypeError). Wenn Sie einen numerischen Wert zuweisen möchten, geben Sie ihn als String an.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Die Funktion os.putenv() ist ebenfalls vorhanden. Allerdings wird der Wert von os.environ nicht aktualisiert, wenn er durch os.putenv() gesetzt wird. Aus diesem Grund ist es besser, den Schlüssel (Name der Umgebungsvariablen) von os.environ anzugeben und den Wert zuzuweisen, wie im obigen Beispiel gezeigt.
Wenn putenv() unterstützt wird, wird eine Zuweisung an ein Element in os.environ automatisch in einen entsprechenden Aufruf von putenv() umgewandelt. In der Praxis ist die Zuweisung an ein Element in os.environ die bevorzugte Operation, da ein direkter Aufruf von putenv() os.environ nicht aktualisiert.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Wie bereits erwähnt, werden Änderungen, die durch Hinzufügen oder Überschreiben von Umgebungsvariablen vorgenommen werden, nur innerhalb des Python-Programms wirksam. Das bedeutet nicht, dass die Umgebungsvariablen des Systems neu geschrieben werden.
Beachten Sie, dass das Ändern des Wertes je nach Betriebssystem ein Speicherleck verursachen kann.
Hinweis: Auf einigen Plattformen, einschließlich FreeBSD und Mac OS X, kann das Ändern des Wertes von environ ein Speicherleck verursachen.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Dies ist auf die putenv()-Spezifikation des Betriebssystems selbst zurückzuführen.
Successive calls to setenv() or putenv() assigning a differently sized value to the same name will result in a memory leak. The FreeBSD seman-tics semantics for these functions (namely, that the contents of value are copied and that old values remain accessible indefinitely) make this bug unavoidable.
Mac OS X Manual Page For putenv(3)
Umgebungsvariablen entfernen
Um eine Umgebungsvariable zu löschen, verwenden Sie die Methode pop() von os.environ oder die Anweisung del. Dasselbe wie dictionary.
Im Folgenden wird ein Beispiel für pop() gezeigt.
pop() gibt den Wert der Umgebungsvariablen zurück, die gelöscht wurde. Standardmäßig führt die Angabe einer Umgebungsvariablen, die nicht existiert, zu einem Fehler (KeyError), aber die Angabe des zweiten Arguments gibt den Wert der Umgebungsvariablen zurück, wenn sie nicht existiert.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Im Folgenden wird ein Beispiel für del.
Die Umgebungsvariable wird erneut hinzugefügt und dann gelöscht. Wenn die Umgebungsvariable nicht existiert, wird ein Fehler (KeyError) ausgegeben.
os.environ['NEW_KEY'] = '100'
print(os.getenv('NEW_KEY'))
# 100
del os.environ['NEW_KEY']
print(os.getenv('NEW_KEY'))
# None
# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'
Die Funktion os.unsetenv() ist ebenfalls vorhanden. Wie bei os.putenv() wird jedoch der Wert von os.environ nicht aktualisiert, wenn er durch os.unsetenv() gelöscht wird. Daher ist es besser, den Schlüssel (Name der Umgebungsvariablen) von os.environ anzugeben und ihn wie im obigen Beispiel zu löschen.
Wenn unsetenv() unterstützt wird, wird das Löschen eines Eintrags in os.environ automatisch in den entsprechenden Aufruf von unsetenv() übersetzt. In der Praxis ist das Löschen von Elementen in os.environ die bevorzugte Operation, da direkte Aufrufe von unsetenv() os.environ nicht aktualisieren.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Das Löschen von Umgebungsvariablen ist ebenfalls nur innerhalb des Python-Programms wirksam. Es entfernt nicht die Systemumgebungsvariablen.
Auswirkungen veränderter Umweltvariablen
Wie ich schon mehrfach geschrieben habe, ändert das Ändern (Setzen oder Löschen) der Umgebungsvariablen os.en nicht die Systemumgebungsvariable, aber es wirkt sich auf die Unterprozesse aus, die im Programm gestartet werden.
Der folgende Code funktioniert unter Windows nicht wie erwartet, da es keine LANG-Umgebungsvariable gibt und der Inhalt des Befehls date anders ist.
Aufruf des Datumsbefehls im Unterprozessmodul.
Das Ergebnis der Ausgabe des Befehls date hängt vom Wert der Umgebungsvariablen LANG ab.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
#
os.environ['LANG'] = 'en_US'
print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
#
Zur Erklärung haben wir die LANG-Umgebungsvariable in os.environ geändert, aber Python bietet ein Locale-Modul, um das Gebietsschema zu steuern.
Umschalten von Prozessen durch Umgebungsvariablen
Es ist auch möglich, den Prozess in Abhängigkeit vom Wert einer Umgebungsvariablen zu schalten.
Hier ist ein Beispiel für die Änderung der Ausgabe entsprechend der Umgebungsvariablen LANG in den Spracheinstellungen. Hier verwenden wir die Methode startswith(), um festzustellen, ob die Zeichenkette mit der angegebenen Zeichenkette beginnt, aber wenn Sie die genaue Übereinstimmung feststellen wollen, können Sie “==” zum Vergleich verwenden.
print(os.getenv('LANG'))
# en_US
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# Hello
os.environ['LANG'] = 'ja_JP'
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# こんにちは
Wenn außerdem Umgebungsvariablen gesetzt sind, die z. B. die Entwicklungs- und die Produktionsumgebung angeben, können Sie die Werte dieser Variablen abrufen und den Prozess umschalten.