Omgevingsvariabelen ophalen, toevoegen, overschrijven en verwijderen in Python (os.environ)

Bedrijf

Omgevingsvariabelen kunnen worden opgehaald, gecontroleerd, ingesteld (toegevoegd of overschreven), en verwijderd in Python programma's met os.environ. Merk op dat veranderingen gemaakt door omgevingsvariabelen in te stellen of te verwijderen alleen effectief zijn binnen het Python programma. Het betekent niet dat de systeemomgevingsvariabelen worden herschreven.

De volgende informatie wordt hier verstrekt.

  • os.environ
  • Haal omgevingsvariabelen op.
  • omgevingsvariabelen instellen (toevoegen)
  • Omgevingsvariabelen verwijderen
  • Effect van veranderende omgevingsvariabelen
  • Schakelen tussen processen via omgevingsvariabelen

Importeer en gebruik de os module. Aangezien het een standaardbibliotheek is, is geen bijkomende installatie vereist. De subprocess module is ook opgenomen in de standaard bibliotheek.

import os
import subprocess

os.environ

Het type van os.environ is os._Environ.

print(type(os.environ))
# <class 'os._Environ'>

os._Environ is een object van het type map met een sleutel- en waardepaar, en heeft dezelfde methoden als een woordenboek (type dict). De naam van de omgevingsvariabele is key, en de waarde is value.

De inhoud van os.environ wordt geladen wanneer de os module wordt geïmporteerd. De inhoud van os.environ wordt niet bijgewerkt, zelfs niet als de systeemomgevingvariabelen op een andere manier worden gewijzigd terwijl het programma draait.

De lijst wordt weergegeven met print().

# print(os.environ)

Net als bij het woordenboek kunt u de volgende methoden gebruiken, of gebruik in om het bestaan van sleutels en waarden te controleren.

  • keys()
  • values()

De verwerking van sleutels en waarden is in principe dezelfde als voor woordenboeken. Hieronder worden voorbeelden gegeven.

Haal omgevingsvariabelen op.

os.environ[Environment variable name]
Hiermee kunt u de waarde van de omgevingsvariabele krijgen, maar als u een omgevingsvariabele-naam opgeeft die niet bestaat, krijgt u een foutmelding (KeyError).

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

De methode get() van os.environ kan worden gebruikt om de standaardwaarde te krijgen als die niet bestaat. Dit is ook hetzelfde als de dictionary.

print(os.environ.get('LANG'))
# ja_JP.UTF-8

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

De functie os.getenv() is ook voorzien. Net als de get() methode van het woordenboek, geeft deze de standaardwaarde terug als de sleutel niet bestaat. Deze functie is handig als je alleen de waarde van een omgevingsvariabele wilt ophalen en controleren.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

omgevingsvariabelen instellen (toevoegen)

os.environ[Environment variable name]
Door hier een waarde aan toe te kennen, kun je een omgevingsvariabele instellen.

Wanneer een nieuwe omgevingsvariabele-naam wordt opgegeven, wordt de omgevingsvariabele nieuw toegevoegd, en wanneer een bestaande omgevingsvariabele-naam wordt opgegeven, wordt de waarde van de omgevingsvariabele overschreven.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Merk op dat het toewijzen van iets anders dan een string zal resulteren in een fout (TypeError). Als u een numerieke waarde wilt toewijzen, specificeer deze dan als een string.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

De functie os.putenv() is ook voorzien. De waarde van os.environ wordt echter niet bijgewerkt wanneer ze wordt ingesteld door os.putenv(). Daarom verdient het de voorkeur om de sleutel (omgevingsvariabele naam) van os.environ op te geven en de waarde toe te kennen zoals in het bovenstaande voorbeeld.

Als putenv() ondersteund wordt, zal een toewijzing aan een item in os.environ automatisch omgezet worden in een overeenkomstige aanroep naar putenv(). In de praktijk is toewijzen aan een item in os.environ de voorkeursoperatie, aangezien een directe aanroep van putenv() os.environ niet zal updaten.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Zoals eerder vermeld, zijn wijzigingen door het toevoegen of overschrijven van omgevingsvariabelen alleen effectief binnen het Python programma. Het betekent niet dat de systeemomgevingvariabelen worden herschreven.

Merk op dat het veranderen van de waarde een geheugenlek kan veroorzaken, afhankelijk van het OS.

Opmerking: Op sommige platformen, waaronder FreeBSD en Mac OS X, kan het veranderen van de waarde van environ een geheugenlek veroorzaken.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Dit is te wijten aan de putenv() specificatie van het OS zelf.

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)

Omgevingsvariabelen verwijderen

Om een omgevingsvariabele te verwijderen, gebruik je de pop() methode van os.environ of het del statement. Hetzelfde als dictionary.

Het volgende is een voorbeeld van pop().

pop() geeft de waarde terug van de omgevingsvariabele die werd verwijderd. Standaard zal het specificeren van een omgevingsvariabele die niet bestaat resulteren in een fout (KeyError), maar het specificeren van het tweede argument zal de waarde van de omgevingsvariabele teruggeven als deze niet bestaat.

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

Het volgende is een voorbeeld van del.

De omgevingsvariabele wordt opnieuw toegevoegd, en vervolgens verwijderd. Als de omgevingsvariabele niet bestaat, volgt een foutmelding (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'

De functie os.unsetenv() is ook voorzien. Echter, net als bij os.putenv(), wordt de waarde van os.environ niet bijgewerkt wanneer het wordt verwijderd door os.unsetenv(). Daarom is het beter om de sleutel (omgevingsvariabele naam) van os.environ op te geven en deze te verwijderen zoals in het bovenstaande voorbeeld.

Als unsetenv() ondersteund wordt, zal het verwijderen van een item in os.environ zich automatisch vertalen naar de overeenkomstige aanroep van unsetenv(). In de praktijk is het verwijderen van items in os.environ de voorkeursoperatie, aangezien directe aanroepen naar unsetenv() os.environ niet zullen updaten.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Het verwijderen van omgevingsvariabelen is ook alleen effectief binnen dat Python programma. Het verwijdert niet de systeem omgevingsvariabelen.

Effect van veranderende omgevingsvariabelen

Zoals ik herhaaldelijk heb geschreven, verandert het veranderen (instellen of verwijderen) van de os.environ omgevingsvariabele de systeemomgevingvariabele niet, maar het heeft wel invloed op de subprocessen die in het programma worden gestart.

De volgende code zal niet werken zoals verwacht op Windows omdat er geen LANG omgevingsvariabele is en de inhoud van het date commando anders is.

Het aanroepen van het datum commando in de subproces module.

Het uitvoerresultaat van het date commando verandert afhankelijk van de waarde van de LANG omgevingsvariabele.

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
# 

Ter verduidelijking, we hebben de LANG omgevingsvariabele in os.environ veranderd, maar Python voorziet in een locale module om de locale te regelen.

Schakelen tussen processen via omgevingsvariabelen

Het is ook mogelijk om het proces om te schakelen volgens de waarde van een omgevingsvariabele.

Hier is een voorbeeld van het veranderen van de uitvoer volgens de LANG omgevingsvariabele in de taalinstellingen. Hier gebruiken we de startswith() methode om te bepalen of de string begint met de gespecificeerde string, maar als je de exacte overeenkomst wilt bepalen, kun je “==” gebruiken om te vergelijken.

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')
# こんにちは

Bovendien, als omgevingsvariabelen zijn ingesteld om bijvoorbeeld de ontwikkelomgeving en de productieomgeving aan te geven, kunt u de waarden van deze variabelen opvragen en het proces omschakelen.