Miljøvariabler kan hentes, kontrolleres, indstilles (tilføjes eller overskrives) og slettes i Python-programmer ved hjælp af os.environ. Bemærk, at ændringer, der foretages ved at indstille eller slette miljøvariabler, kun er effektive inden for Python-programmet. Det betyder ikke, at systemets miljøvariabler vil blive omskrevet.
Her findes følgende oplysninger.
os.environ
- Hent miljøvariabler.
- Indstil (add\overwrite) miljøvariabler
- Fjern miljøvariabler
- Virkning af ændrede miljøvariabler
- Skift af processer ved hjælp af miljøvariabler
Importér og brug os-modulet. Da det er et standardbibliotek, er der ikke behov for yderligere installation. Subprocess-modulet er også inkluderet i standardbiblioteket.
import os
import subprocess
os.environ
Typen af os.environ er os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ er et objekt af map-typen med et par nøgle og værdi og har de samme metoder som en ordbog (dict-typen). Navnet på miljøvariablen er key, og dens værdi er value.
Indholdet af os.environ vil blive indlæst, når os-modulet importeres. Indholdet af os.environ vil ikke blive opdateret, selv om systemets miljøvariabler ændres på anden vis, mens programmet kører.
Listen vises med print().
# print(os.environ)
Som med en ordbog kan du bruge følgende metoder eller bruge in til at kontrollere, om der findes nøgler og værdier.
keys()
values()
Behandlingen af nøgler og værdier er grundlæggende den samme som for ordbøger. Nedenfor er der eksempler.
Hent miljøvariabler.
os.environ[Environment variable name]
Dette giver dig mulighed for at få værdien af miljøvariablen, men hvis du angiver et navn på en miljøvariabel, der ikke findes, får du en fejl (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Metoden get() i os.environ kan bruges til at hente standardværdien, hvis den ikke findes. Dette er også det samme som med ordbogen.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Funktionen os.getenv() er også tilgængelig. Ligesom get()-metoden for ordbogen returnerer den standardværdien, hvis nøglen ikke findes. Denne funktion er nyttig, hvis du blot ønsker at hente og kontrollere værdien af en miljøvariabel.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Indstil (add\overwrite) miljøvariabler
os.environ[Environment variable name]
Ved at tildele en værdi til dette kan du indstille en miljøvariabel.
Når der angives et nyt navn på en miljøvariabel, tilføjes miljøvariablen, og når der angives et eksisterende navn på en miljøvariabel, overskrives værdien af miljøvariablen.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Bemærk, at tildeling af noget andet end en streng vil resultere i en fejl (TypeError). Hvis du ønsker at tildele en numerisk værdi, skal du angive den som en streng.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Funktionen os.putenv() er også tilgængelig. Værdien af os.environ opdateres dog ikke, når den er sat af os.putenv(). Derfor er det at foretrække at angive nøglen (navnet på miljøvariablen) for os.environ og tildele værdien som vist i eksemplet ovenfor.
Hvis putenv() er understøttet, vil en tildeling til et element i os.environ automatisk blive konverteret til et tilsvarende kald til putenv(). I praksis er det at tildele et element i os.environ den foretrukne operation, da et direkte kald til putenv() ikke vil opdatere os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Som nævnt tidligere er ændringer, der foretages ved at tilføje eller overskrive miljøvariabler, kun effektive inden for Python-programmet. Det betyder ikke, at systemets miljøvariabler vil blive omskrevet.
Bemærk, at ændring af værdien kan forårsage en hukommelseslækage afhængigt af operativsystemet.
Bemærk: På nogle platforme, herunder FreeBSD og Mac OS X, kan ændring af værdien af environ forårsage en hukommelseslækage.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Dette skyldes specifikationen putenv() i selve operativsystemet.
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)
Fjern miljøvariabler
Hvis du vil slette en miljøvariabel, skal du bruge pop()-metoden i os.environ eller del-meddelelsen. Samme som i ordbogen.
Følgende er et eksempel på pop().
pop() returnerer værdien af den miljøvariabel, der blev slettet. Som standard vil angivelse af en miljøvariabel, der ikke findes, resultere i en fejl (KeyError), men hvis du angiver det andet argument, returneres værdien af miljøvariablen, hvis den ikke findes.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Følgende er et eksempel på del.
Miljøvariablen tilføjes igen og slettes derefter. Hvis miljøvariablen ikke findes, vises en fejl (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'
Funktionen os.unsetenv() er også tilgængelig. Men ligesom med os.putenv(), opdateres værdien af os.environ ikke, når den slettes af os.unsetenv(). Derfor er det at foretrække at angive nøglen (navnet på miljøvariablen) for os.environ og slette den som vist i eksemplet ovenfor.
Hvis unsetenv() understøttes, vil sletning af et element i os.environ automatisk blive oversat til det tilsvarende kald til unsetenv(). I praksis er det at slette elementer i os.environ den foretrukne operation, da direkte kald til unsetenv() ikke vil opdatere os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Sletning af miljøvariabler er også kun effektiv inden for det pågældende Python-program. Det fjerner ikke systemets miljøvariabler.
Virkning af ændrede miljøvariabler
Som jeg har skrevet gentagne gange, ændrer en ændring (indstilling eller sletning) af miljøvariablen os.environ ikke systemets miljøvariabel, men det påvirker de underprocesser, der startes i programmet.
Følgende kode vil ikke fungere som forventet på Windows, fordi der ikke er nogen LANG-miljøvariabel, og indholdet af date-kommandoen er anderledes.
Kaldelse af kommandoen date i underprocesmodulet.
Output-resultatet af kommandoen date ændres afhængigt af værdien af miljøvariablen 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
#
Af hensyn til forklaringen har vi ændret miljøvariablen LANG i os.environ, men Python indeholder et locale-modul til at styre locale.
Skift af processer ved hjælp af miljøvariabler
Det er også muligt at skifte processen i henhold til værdien af en miljøvariabel.
Her er et eksempel på at ændre output i henhold til miljøvariablen LANG i sprogindstillingerne. Her bruger vi metoden startswith() til at bestemme, om strengen starter med den angivne streng, men hvis du vil bestemme det nøjagtige match, kan du bruge “==” til at sammenligne.
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')
# こんにちは
Hvis der desuden er indstillet miljøvariabler til at angive f.eks. udviklingsmiljøet og produktionsmiljøet, kan du få værdierne for disse variabler og skifte processen.