Hämta, lägga till, skriva över och radera miljövariabler i Python (os.environ)

Företag

Miljövariabler kan hämtas, kontrolleras, ställas in (läggas till eller skrivas över) och raderas i Pythonprogram med hjälp av os.environ. Observera att ändringar som görs genom att ställa in eller ta bort miljövariabler endast gäller inom Pythonprogrammet. Det betyder inte att systemets miljövariabler kommer att skrivas om.

Här finns följande information.

  • os.environ
  • Hämta miljövariabler.
  • Ange (add\overwrite) miljövariabler
  • Ta bort miljövariabler
  • Effekten av förändrade miljövariabler
  • Växla processer med hjälp av miljövariabler

Importera och använda modulen os. Eftersom det är ett standardbibliotek krävs ingen ytterligare installation. Subprocessmodulen ingår också i standardbiblioteket.

import os
import subprocess

os.environ

Typ av os.environ är os._Environ.

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

os._Environ är ett objekt av karttyp med ett par nyckel och värde och har samma metoder som en ordbok (typ dict). Namnet på miljövariabeln är nyckel och dess värde är värde.

Innehållet i os.environ laddas när modulen os importeras. Innehållet i os.environ kommer inte att uppdateras även om systemmiljövariablerna ändras på annat sätt medan programmet körs.

Listan visas med print().

# print(os.environ)

Precis som för ordboken kan du använda följande metoder eller använda in för att kontrollera om nycklar och värden finns.

  • keys()
  • values()

Behandlingen av nycklar och värden är i princip densamma som för ordböcker. Exempel ges nedan.

Hämta miljövariabler.

os.environ[Environment variable name]
På så sätt kan du få fram värdet på miljövariabeln, men om du anger ett namn på en miljövariabel som inte finns kommer du att få ett fel (KeyError).

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

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

Metoden get() i os.environ kan användas för att hämta standardvärdet om det inte finns. Detta är också samma sak som i lexikonet.

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() finns också. Liksom get()-metoden för ordboken returnerar den standardvärdet om nyckeln inte finns. Den här funktionen är användbar om du bara vill hämta och kontrollera värdet på en miljövariabel.

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

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

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

Ange (add\overwrite) miljövariabler

os.environ[Environment variable name]
Genom att tilldela ett värde till detta kan du ange en miljövariabel.

När ett nytt namn på en miljövariabel anges läggs miljövariabeln till, och när ett befintligt namn på en miljövariabel anges skrivs värdet på miljövariabeln över.

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

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

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

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

Observera att om du tilldelar något annat än en sträng kommer det att resultera i ett fel (TypeError). Om du vill tilldela ett numeriskt värde ska du ange det som en sträng.

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

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

Funktionen os.putenv() finns också. Värdet för os.environ uppdateras dock inte när det sätts av os.putenv(). Därför är det bättre att ange nyckeln (namnet på miljövariabeln) för os.environ och tilldela värdet enligt exemplet ovan.

Om putenv() stöds, kommer en tilldelning till ett objekt i os.environ automatiskt att konverteras till ett motsvarande anrop till putenv(). I praktiken är det bättre att tilldela ett objekt i os.environ, eftersom ett direkt anrop till putenv() inte uppdaterar os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Som tidigare nämnts är ändringar som görs genom att lägga till eller skriva över miljövariabler endast effektiva inom Pythonprogrammet. Det betyder inte att systemets miljövariabler skrivs om.

Observera att om du ändrar värdet kan det orsaka en minnesläcka beroende på operativsystemet.

Notera: På vissa plattformar, inklusive FreeBSD och Mac OS X, kan ändring av värdet för environ orsaka en minnesläcka.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Detta beror på specifikationen putenv() i själva 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)

Ta bort miljövariabler

Om du vill ta bort en miljövariabel använder du metoden pop() i os.environ eller del-kommandot. Samma som för ordbok.

Följande är ett exempel på pop().

pop() returnerar värdet på den miljövariabel som raderades. Om du anger en miljövariabel som inte existerar kommer du som standard att få ett fel (KeyError), men om du anger det andra argumentet returneras värdet av miljövariabeln om den inte existerar.

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öljande är ett exempel på del.

Miljövariabeln läggs till igen och tas sedan bort. Om miljövariabeln inte existerar visas ett fel (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() finns också. Precis som med os.putenv() uppdateras dock inte värdet på os.environ när det raderas av os.unsetenv(). Därför är det bättre att ange nyckeln (namnet på miljövariabeln) för os.environ och ta bort den som i exemplet ovan.

Om unsetenv() stöds kommer radering av ett objekt i os.environ automatiskt att översättas till motsvarande anrop till unsetenv(). I praktiken är det bättre att ta bort objekt i os.environ, eftersom direkta anrop till unsetenv() inte uppdaterar os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Att radera miljövariabler är också effektivt endast inom det aktuella Pythonprogrammet. Det tar inte bort systemets miljövariabler.

Effekten av förändrade miljövariabler

Som jag har skrivit upprepade gånger ändrar (sätter eller tar bort) miljövariabeln os.environ inte systemets miljövariabel, men det påverkar de underprocesser som startas i programmet.

Följande kod fungerar inte som förväntat i Windows eftersom det inte finns någon miljövariabel LANG och innehållet i kommandot date är annorlunda.

Anropar datumkommandot i underprocessmodulen.

Resultatet av datumkommandot ändras beroende på värdet av miljövariabeln 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
# 

För att förklara har vi ändrat miljövariabeln LANG i os.environ, men Python tillhandahåller en locale-modul för att kontrollera språket.

Växla processer med hjälp av miljövariabler

Det är också möjligt att byta process beroende på värdet av en miljövariabel.

Här är ett exempel på hur du ändrar utmatningen enligt miljövariabeln LANG i språkinställningarna. Här använder vi metoden startswith() för att avgöra om strängen börjar med den angivna strängen, men om du vill avgöra den exakta överensstämmelsen kan du använda ”==” för att jämföra.

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

Om miljövariabler är inställda för att indikera t.ex. utvecklingsmiljön och produktionsmiljön kan du ta reda på värdena för dessa variabler och byta process.

Copied title and URL