Obținerea, adăugarea, suprascrierea și ștergerea variabilelor de mediu în Python (os.environ)

Afaceri

Variabilele de mediu pot fi recuperate, verificate, setate (adăugate sau suprascrise) și șterse în programele Python folosind os.environ. Rețineți că modificările efectuate prin setarea sau ștergerea variabilelor de mediu au efect numai în cadrul programului Python. Aceasta nu înseamnă că variabilele de mediu ale sistemului vor fi rescrise.

Aici sunt furnizate următoarele informații.

  • os.environ
  • Obține variabilele de mediu.
  • Setați variabilele de mediu (add\overwrite)
  • Eliminați variabilele de mediu
  • Efectul modificării variabilelor de mediu
  • Comutarea proceselor prin variabile de mediu

Importați și utilizați modulul os. Deoarece este o bibliotecă standard, nu este necesară nicio instalare suplimentară. Modulul subprocess este, de asemenea, inclus în biblioteca standard.

import os
import subprocess

os.environ

Tipul os.environ este os._Environ.

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

os._Environ este un obiect de tip hartă cu o pereche de cheie și valoare și are aceleași metode ca și un dicționar (tip dict). Numele variabilei de mediu este key, iar valoarea sa este value.

Conținutul din os.environ va fi încărcat atunci când modulul os este importat. Conținutul os.environ nu va fi actualizat chiar dacă variabilele de mediu ale sistemului sunt modificate prin alte mijloace în timpul rulării programului.

Lista este afișată cu ajutorul funcției print().

# print(os.environ)

Ca și în cazul dicționarului, puteți utiliza următoarele metode sau puteți utiliza in pentru a verifica existența cheilor și a valorilor.

  • keys()
  • values()

Prelucrarea cheilor și a valorilor este practic aceeași ca și în cazul dicționarelor. Exemplele sunt prezentate mai jos.

Obține variabilele de mediu.

os.environ[Environment variable name]
Acest lucru vă va permite să obțineți valoarea variabilei de mediu, dar dacă specificați un nume de variabilă de mediu care nu există, veți primi o eroare (KeyError).

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

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

Metoda get() din os.environ poate fi utilizată pentru a obține valoarea implicită dacă aceasta nu există. Această metodă este, de asemenea, aceeași cu cea a dicționarului.

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 asemenea, este furnizată funcția os.getenv(). La fel ca metoda get() a dicționarului, aceasta returnează valoarea implicită în cazul în care cheia nu există. Această funcție este utilă dacă doriți doar să obțineți și să verificați valoarea unei variabile de mediu.

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

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

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

Setați variabilele de mediu (add\overwrite)

os.environ[Environment variable name]
Prin atribuirea unei valori la acest parametru, puteți seta o variabilă de mediu.

Atunci când se specifică un nou nume de variabilă de mediu, variabila de mediu este nou adăugată, iar atunci când se specifică un nume de variabilă de mediu existent, valoarea variabilei de mediu este suprascrisă.

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

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

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

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

Rețineți că atribuirea a orice altceva decât un șir de caractere va duce la o eroare (TypeError). Dacă doriți să atribuiți o valoare numerică, specificați-o sub forma unui șir de caractere.

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

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

Este prevăzută și funcția os.putenv(). Cu toate acestea, valoarea os.environ nu este actualizată atunci când este stabilită de os.putenv(). Din acest motiv, este preferabil să se specifice cheia (numele variabilei de mediu) din os.environ și să se atribuie valoarea, așa cum se arată în exemplul de mai sus.

În cazul în care putenv() este acceptat, o atribuire la un element din os.environ va fi automat convertită într-un apel corespunzător la putenv(). În practică, atribuirea la un element din os.environ este operațiunea preferată, deoarece un apel direct la putenv() nu va actualiza os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

După cum s-a menționat anterior, modificările efectuate prin adăugarea sau suprascrierea variabilelor de mediu sunt valabile numai în cadrul programului Python. Aceasta nu înseamnă că variabilele de mediu ale sistemului vor fi rescrise.

Rețineți că modificarea valorii poate cauza o scurgere de memorie în funcție de sistemul de operare.

Notă: Pe unele platforme, inclusiv FreeBSD și Mac OS X, modificarea valorii lui environ poate cauza o scurgere de memorie.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Acest lucru se datorează specificației putenv() a sistemului de operare însuși.

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)

Eliminați variabilele de mediu

Pentru a șterge o variabilă de mediu, utilizați metoda pop() din os.environ sau instrucțiunea del. La fel ca în cazul dicționarului.

Următorul este un exemplu de pop().

pop() returnează valoarea variabilei de mediu care a fost ștearsă. În mod implicit, specificarea unei variabile de mediu care nu există va genera o eroare (KeyError), dar specificarea celui de-al doilea argument va returna valoarea variabilei de mediu dacă aceasta nu există.

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

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

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

Următorul este un exemplu de del.

Variabila de mediu este adăugată din nou și apoi ștearsă. În cazul în care variabila de mediu nu există, apare o eroare (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 asemenea, este furnizată funcția os.unsetenv(). Cu toate acestea, ca și în cazul os.putenv(), valoarea os.environ nu este actualizată atunci când este ștearsă de os.unsetenv(). Prin urmare, este de preferat să se specifice cheia (numele variabilei de mediu) din os.environ și să se șteargă aceasta, așa cum se arată în exemplul de mai sus.

În cazul în care unsetenv() este acceptat, ștergerea unui element din os.environ se va traduce automat prin apelul corespunzător la unsetenv(). În practică, ștergerea elementelor din os.environ este operațiunea preferată, deoarece apelurile directe la unsetenv() nu vor actualiza os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Ștergerea variabilelor de mediu este, de asemenea, eficientă numai în cadrul programului Python respectiv. Aceasta nu elimină variabilele de mediu ale sistemului.

Efectul modificării variabilelor de mediu

După cum am scris în repetate rânduri, modificarea (setarea sau ștergerea) variabilei de mediu os.environ nu modifică variabila de mediu a sistemului, dar afectează subprocesele care sunt lansate în program.

Următorul cod nu va funcționa conform așteptărilor pe Windows deoarece nu există o variabilă de mediu LANG și conținutul comenzii date este diferit.

Apelarea comenzii date în modulul subproces.

Rezultatul de ieșire al comenzii date se modifică în funcție de valoarea variabilei de mediu 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
# 

De dragul explicațiilor, am schimbat variabila de mediu LANG în os.environ, dar Python oferă un modul locale pentru a controla locale.

Comutarea proceselor prin variabile de mediu

De asemenea, este posibilă comutarea procesului în funcție de valoarea unei variabile de mediu.

Iată un exemplu de modificare a ieșirii în funcție de variabila de mediu LANG din setările de limbă. Aici folosim metoda startswith() pentru a determina dacă șirul începe cu șirul specificat, dar dacă doriți să determinați corespondența exactă, puteți folosi „==” pentru a compara.

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

În plus, dacă variabilele de mediu sunt setate pentru a indica mediul de dezvoltare și mediul de producție, de exemplu, puteți obține valorile acestor variabile și puteți schimba procesul.

Copied title and URL