Dobivanje, dodavanje, prepisivanje i brisanje varijabli okruženja u Pythonu (os.environ)

Poslovanje

Varijable okruženja mogu se dohvatiti, provjeriti, postaviti (dodati ili prebrisati) i izbrisati u programima Python pomoću os.environ. Imajte na umu da su promjene postavljene ili brisanjem varijabli okruženja učinkovite samo unutar programa Python. To ne znači da će se varijable okruženja sustava prepisati.

Ovdje su navedene sljedeće informacije.

  • os.environ
  • Nabavite varijable okruženja.
  • Postavite (dodajte/prepišite) varijable okruženja
  • Uklonite varijable okruženja
  • Učinak promjene varijabli okruženja
  • Prebacivanje procesa prema varijablama okruženja

Uvezite i koristite os modul. Budući da je to standardna knjižnica, nije potrebna dodatna instalacija. Modul potprocesa također je uključen u standardnu ​​biblioteku.

import os
import subprocess

os.environ

Tip os.environ je os._Environ.

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

os._Environ je objekt vrste karte s parom ključa i vrijednosti i ima iste metode kao i rječnik (tip dict). Naziv varijable okruženja je ključ, a njegova vrijednost je vrijednost.

Sadržaj os.environ učitat će se pri uvozu os modula. Sadržaj os.environna neće se ažurirati čak i ako se varijable okruženja sustava promijene na neki drugi način dok je program pokrenut.

Popis se prikazuje ispisom ().

# print(os.environ)

Kao i sa rječnikom, možete koristiti sljedeće metode ili upotrijebiti u za provjeru postojanja ključeva i vrijednosti.

  • keys()
  • values()

Obrada ključeva i vrijednosti u osnovi je ista kao i za rječnike. Primjeri su navedeni u nastavku.

Nabavite varijable okruženja.

os.environ[Environment variable name]
To će vam omogućiti da dobijete vrijednost varijable okruženja, ali ako navedete naziv varijable okruženja koji ne postoji, dobit ćete pogrešku (KeyError).

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

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

Metoda get () os.environ može se koristiti za dobivanje zadane vrijednosti ako ne postoji. Ovo je isto što i rječnik.

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

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

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

Omogućena je i funkcija os.getenv (). Poput get () metode rječnika, vraća zadanu vrijednost ako ključ ne postoji. Ova je funkcija korisna ako samo želite dobiti i provjeriti vrijednost varijable okruženja.

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

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

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

Postavite (dodajte/prepišite) varijable okruženja

os.environ[Environment variable name]
Dodjeljivanjem vrijednosti ovome možete postaviti varijablu okruženja.

Kad se navede novi naziv varijable okruženja, varijabla okruženja se dodaje novo, a kada se navede naziv postojeće varijable okruženja, vrijednost varijable okoline se prepisuje.

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

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

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

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

Imajte na umu da će dodjeljivanje bilo čega osim niza rezultirati pogreškom (TypeError). Ako želite dodijeliti brojčanu vrijednost, navedite je kao niz.

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

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

Omogućena je i funkcija os.putenv (). Međutim, vrijednost os.environ se ne ažurira kada je postavljena os.putenv (). Iz tog razloga, poželjno je navesti ključ (naziv varijable okruženja) os.environ i dodijeliti vrijednost kao što je prikazano u gornjem primjeru.

Ako je podržan putenv (), dodjela stavke u os.environmentu automatski će se pretvoriti u odgovarajući poziv u putenv (). U praksi je dodjeljivanje stavke u os.environnu preferirana operacija, budući da izravni poziv na putenv () neće ažurirati os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Kao što je ranije spomenuto, promjene napravljene dodavanjem ili prepisivanjem varijabli okruženja učinkovite su samo unutar programa Python. To ne znači da će se varijable okruženja sustava prepisati.

Imajte na umu da promjena vrijednosti može uzrokovati curenje memorije ovisno o OS -u.

Napomena: Na nekim platformama, uključujući FreeBSD i Mac OS X, promjena vrijednosti okoline može uzrokovati curenje memorije.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

To je zbog specifikacije putenv () samog OS -a.

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)

Uklonite varijable okruženja

Za brisanje varijable okruženja upotrijebite metodu pop () os.environ ili naredbu del. Isto kao i rječnik.

Slijedi primjer pop ().

pop () vraća vrijednost varijable okruženja koja je izbrisana. Prema zadanim postavkama, navođenje varijable okruženja koja ne postoji rezultirat će pogreškom (KeyError), ali navođenje drugog argumenta vratit će vrijednost varijable okoline ako ne postoji.

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

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

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

Slijedi primjer del.

Varijabla okruženja se ponovno dodaje, a zatim briše. Ako varijabla okruženja ne postoji, dolazi do pogreške (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'

Omogućena je i funkcija os.unsetenv (). Međutim, kao i kod os.putenv (), vrijednost os.environna se ne ažurira kada ga briše os.unsetenv (). Stoga je poželjno navesti ključ (naziv varijable okruženja) os.environ i izbrisati ga kao što je prikazano u gornjem primjeru.

Ako je podržan unsetenv (), brisanje stavke u os.environnu automatski će se prevesti u odgovarajući poziv u unsetenv (). U praksi, brisanje stavki u os.environonu je poželjna operacija, budući da izravni pozivi na unsetenv () neće ažurirati os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Brisanje varijabli okruženja također je učinkovito samo unutar tog Python programa. Ne uklanja varijable okruženja sustava.

Učinak promjene varijabli okruženja

Kao što sam više puta napisao, mijenjanje (postavljanje ili brisanje) varijable okoline os.environona ne mijenja varijablu okruženja sustava, ali utječe na podprocese koji se pokreću u programu.

Sljedeći kôd neće raditi kako se očekuje u sustavu Windows jer ne postoji LANG varijabla okruženja i sadržaj naredbe date je drugačiji.

Pozivanje naredbe date u modulu potprocesa.

Izlazni rezultat naredbe date mijenja se ovisno o vrijednosti varijable okruženja 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
# 

Radi objašnjenja, promijenili smo varijablu okruženja LANG u os.environnu, ali Python pruža modul lokalizacije za kontrolu lokalizacije.

Prebacivanje procesa prema varijablama okruženja

Također je moguće prebaciti proces prema vrijednosti varijable okruženja.

Evo primjera promjene izlaza prema varijabli okruženja LANG u jezičnim postavkama. Ovdje koristimo metodu startwith () da odredimo počinje li niz s navedenim nizom, ali ako želite odrediti točno podudaranje, možete upotrijebiti “==”.

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

Osim toga, ako su varijable okruženja postavljene tako da označavaju razvojno okruženje i proizvodno okruženje, na primjer, možete dobiti vrijednosti tih varijabli i prebaciti proces.