Zmienne środowiskowe mogą być pobierane, sprawdzane, ustawiane (dodawane lub nadpisywane) i usuwane w programach Pythona za pomocą os.environ. Należy pamiętać, że zmiany dokonane przez ustawienie lub usunięcie zmiennych środowiskowych są skuteczne tylko w obrębie programu Pythona. Nie oznacza to, że systemowe zmienne środowiskowe zostaną przepisane.
Podane są tu następujące informacje.
os.environ
- Pobierz zmienne środowiskowe.
- Ustawianie (dodawanie) zmiennych środowiskowych
- Usuń zmienne środowiskowe
- Wpływ zmieniających się zmiennych środowiskowych
- Przełączanie procesów za pomocą zmiennych środowiskowych
Zaimportuj i użyj modułu os. Ponieważ jest to biblioteka standardowa, nie jest wymagana żadna dodatkowa instalacja. Moduł podprocesu jest również zawarty w bibliotece standardowej.
import os
import subprocess
os.environ
Typem os.environ jest os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ jest obiektem typu map z parą klucz i wartość, i posiada te same metody co słownik (typ dict). Nazwą zmiennej środowiskowej jest klucz, a jej wartością jest wartość.
Zawartość os.environ zostanie załadowana, gdy moduł os zostanie zaimportowany. Zawartość os.environ nie będzie aktualizowana nawet jeśli zmienne środowiskowe systemu zostaną zmienione w inny sposób podczas działania programu.
Lista jest wyświetlana za pomocą funkcji print().
# print(os.environ)
Podobnie jak w przypadku słownika, możesz użyć poniższych metod lub użyć in, aby sprawdzić istnienie kluczy i wartości.
keys()
values()
Przetwarzanie kluczy i wartości jest w zasadzie takie samo jak w przypadku słowników. Przykłady są podane poniżej.
Pobierz zmienne środowiskowe.
os.environ[Environment variable name]
To pozwoli ci uzyskać wartość zmiennej środowiskowej, ale jeśli podasz nazwę zmiennej środowiskowej, która nie istnieje, otrzymasz błąd (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Metoda get() w os.environ może być użyta do uzyskania wartości domyślnej, jeśli ona nie istnieje. Jest to również to samo, co słownik.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Udostępniona jest również funkcja os.getenv(). Podobnie jak metoda get() słownika, zwraca ona wartość domyślną, jeśli klucz nie istnieje. Funkcja ta jest przydatna, jeśli chcesz tylko uzyskać i sprawdzić wartość zmiennej środowiskowej.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Ustawianie (dodawanie) zmiennych środowiskowych
os.environ[Environment variable name]
Przypisując wartość do tego, można ustawić zmienną środowiskową.
Gdy podana jest nowa nazwa zmiennej środowiskowej, zmienna środowiskowa zostanie dodana na nowo, a gdy podana jest istniejąca nazwa zmiennej środowiskowej, wartość zmiennej środowiskowej zostanie nadpisana.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Zauważ, że przypisanie czegokolwiek innego niż łańcuch spowoduje błąd (TypeError). Jeżeli chcesz przypisać wartość liczbową, to określ ją jako łańcuch.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Funkcja os.putenv() jest również udostępniona. Jednakże, wartość os.environ nie jest uaktualniana, gdy jest ustawiana przez os.putenv(). Z tego powodu, lepiej jest określić klucz (nazwę zmiennej środowiskowej) os.environ i przypisać wartość, jak pokazano w powyższym przykładzie.
Jeśli obsługiwana jest funkcja putenv(), to przypisanie do elementu w os.environ zostanie automatycznie przekonwertowane na odpowiadające mu wywołanie putenv(). W praktyce, przypisanie do elementu w os.environ jest preferowaną operacją, ponieważ bezpośrednie wywołanie putenv() nie uaktualni os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Jak wspomniano wcześniej, zmiany dokonane przez dodanie lub nadpisanie zmiennych środowiskowych są skuteczne tylko w obrębie programu Pythona. Nie oznacza to, że systemowe zmienne środowiskowe zostaną przepisane.
Zauważ, że zmiana wartości może spowodować wyciek pamięci w zależności od systemu operacyjnego.
Uwaga: Na niektórych platformach, w tym FreeBSD i Mac OS X, zmiana wartości environ może spowodować wyciek pamięci.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Wynika to ze specyfikacji putenv() samego systemu operacyjnego.
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)
Usuń zmienne środowiskowe
Aby usunąć zmienną środowiskową, użyj metody pop() z os.environ lub instrukcji del. Tak samo jak słownik.
Poniżej znajduje się przykład użycia funkcji pop().
pop() zwraca wartość zmiennej środowiskowej, która została usunięta. Domyślnie, podanie zmiennej środowiskowej, która nie istnieje, spowoduje błąd (KeyError), ale podanie drugiego argumentu zwróci wartość zmiennej środowiskowej, jeśli ta nie istnieje.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Poniżej znajduje się przykład del.
Zmienna środowiskowa zostanie ponownie dodana, a następnie usunięta. Jeżeli zmienna środowiskowa nie istnieje, zostanie wyświetlony błąd (KeyError).
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'
Funkcja os.unsetenv() jest również udostępniona. Jednakże, tak jak w przypadku os.putenv(), wartość os.environ nie jest aktualizowana, gdy jest usuwana przez os.unsetenv(). Dlatego preferowane jest określenie klucza (nazwy zmiennej środowiskowej) os.environ i usunięcie go, jak pokazano w powyższym przykładzie.
Jeśli obsługiwana jest funkcja unsetenv(), to usunięcie elementu w os.environ automatycznie przełoży się na odpowiednie wywołanie funkcji unsetenv(). W praktyce, kasowanie elementów w os.environ jest preferowaną operacją, ponieważ bezpośrednie wywołania unsetenv() nie będą aktualizować os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Usuwanie zmiennych środowiskowych jest skuteczne tylko w obrębie danego programu Pythona. Nie usuwa systemowych zmiennych środowiskowych.
Wpływ zmieniających się zmiennych środowiskowych
Jak już wielokrotnie pisałem, zmiana (ustawienie lub usunięcie) zmiennej środowiskowej os.environ nie zmienia zmiennej środowiskowej systemu, ale ma wpływ na podprocesy uruchamiane w programie.
Poniższy kod nie będzie działał zgodnie z oczekiwaniami w systemie Windows, ponieważ nie ma zmiennej środowiskowej LANG, a zawartość polecenia date jest inna.
Wywołanie polecenia date w module podprocesu.
Wynik wyjściowy polecenia date zmienia się w zależności od wartości zmiennej środowiskowej LANG.
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
#
Dla wyjaśnienia, zmieniliśmy zmienną środowiskową LANG w os.environ, ale Python dostarcza moduł locale do kontrolowania locale.
Przełączanie procesów za pomocą zmiennych środowiskowych
Możliwe jest również przełączanie procesu według wartości zmiennej środowiskowej.
Oto przykład zmiany wyjścia w zależności od zmiennej środowiskowej LANG w ustawieniach języka. Tutaj używamy metody startswith() do określenia, czy łańcuch zaczyna się od podanego łańcucha, ale jeśli chcesz określić dokładne dopasowanie, możesz użyć „==” do porównania.
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')
# こんにちは
Ponadto, jeśli zmienne środowiskowe są ustawione tak, aby wskazywały na przykład na środowisko deweloperskie i środowisko produkcyjne, można uzyskać wartości tych zmiennych i przełączyć proces.