Hentning, tilføjelse, overskrivning og sletning af miljøvariabler i Python (os.environ)

Forretning

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.