Marrja, shtimi, mbishkrimi dhe fshirja e ndryshoreve të mjedisit në Python (os.environ)

biznes

Variablat e mjedisit mund të merren, kontrollohen, vendosen (shtohen ose mbishkruhen) dhe fshihen në programet Python duke përdorur os.environ. Vini re se ndryshimet e bëra duke vendosur ose fshirë ndryshoret e mjedisit janë efektive vetëm brenda programit Python. Kjo nuk do të thotë që variablat e mjedisit të sistemit do të rishkruhen.

Informacioni i mëposhtëm jepet këtu.

  • os.environ
  • Merrni ndryshoret e mjedisit.
  • Vendosni (shtoni/mbishkruani) ndryshoret e mjedisit
  • Hiq ndryshoret e mjedisit
  • Efekti i ndryshimit të variablave të mjedisit
  • Kalimi i proceseve sipas variablave të mjedisit

Importoni dhe përdorni modulin os. Meqenëse është një bibliotekë standarde, nuk kërkohet instalim shtesë. Moduli i nënprocesit përfshihet gjithashtu në bibliotekën standarde.

import os
import subprocess

os.environ

Lloji i os.environ është os._Environ.

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

os._Environ është një objekt i tipit të hartës me një palë çelës dhe vlerë, dhe ka të njëjtat metoda si një fjalor (lloji i diktit). Emri i ndryshores së mjedisit është kyç, dhe vlera e tij është vlerë.

Përmbajtja e os.environ do të ngarkohet kur moduli os të importohet. Përmbajtja e os.environ nuk do të azhurnohet edhe nëse ndryshoret e mjedisit të sistemit ndryshojnë me mjete të tjera gjatë funksionimit të programit.

Lista shfaqet me print ().

# print(os.environ)

Ashtu si me fjalorin, mund të përdorni metodat e mëposhtme, ose përdorni in për të kontrolluar ekzistencën e çelësave dhe vlerave.

  • keys()
  • values()

Përpunimi i çelësave dhe vlerave është në thelb i njëjtë me fjalorët. Shembujt janë dhënë më poshtë.

Merrni ndryshoret e mjedisit.

os.environ[Environment variable name]
Kjo do t’ju lejojë të merrni vlerën e ndryshores së mjedisit, por nëse specifikoni një emër të ndryshores së mjedisit që nuk ekziston, do të merrni një gabim (KeyError).

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

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

Metoda get () e os.environ mund të përdoret për të marrë vlerën e paracaktuar nëse nuk ekziston. Kjo është gjithashtu e njëjtë me fjalorin.

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

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

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

Ofrohet gjithashtu funksioni os.getenv (). Ashtu si metoda get () e fjalorit, ai kthen vlerën e paracaktuar nëse çelësi nuk ekziston. Ky funksion është i dobishëm nëse thjesht doni të merrni dhe kontrolloni vlerën e një ndryshoreje të mjedisit.

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

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

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

Vendosni (shtoni/mbishkruani) ndryshoret e mjedisit

os.environ[Environment variable name]
Duke i caktuar një vlerë kësaj, ju mund të vendosni një ndryshore të mjedisit.

Kur specifikohet një emër i ri i ndryshores së mjedisit, ndryshorja e mjedisit shtohet rishtas, dhe kur specifikohet një emër i ndryshores ekzistuese të mjedisit, vlera e ndryshores së mjedisit mbishkruhet.

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

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

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

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

Vini re se caktimi i çdo gjëje tjetër përveç një vargu do të rezultojë në një gabim (TypeError). Nëse doni të caktoni një vlerë numerike, specifikoni atë si një varg.

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

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

Ofrohet gjithashtu funksioni os.putenv (). Sidoqoftë, vlera e os.environ nuk azhurnohet kur vendoset nga os.putenv (). Për këtë arsye, është e preferueshme të specifikoni çelësin (emri i ndryshores së mjedisit) të os.environ dhe të caktoni vlerën siç tregohet në shembullin e mësipërm.

Nëse putenv () mbështetet, një caktim për një artikull në os.environ do të konvertohet automatikisht në një thirrje përkatëse në putenv (). Në praktikë, caktimi i një artikulli në os.environ është operacioni i preferuar, pasi një thirrje e drejtpërdrejtë në putenv () nuk do të azhurnojë os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Siç u përmend më herët, ndryshimet e bëra duke shtuar ose rishkruar variablat e mjedisit janë efektive vetëm brenda programit Python. Kjo nuk do të thotë që variablat e mjedisit të sistemit do të rishkruhen.

Vini re se ndryshimi i vlerës mund të shkaktojë rrjedhje të kujtesës në varësi të sistemit operativ.

Shënim: Në disa platforma, përfshirë FreeBSD dhe Mac OS X, ndryshimi i vlerës së mjedisit mund të shkaktojë rrjedhje të kujtesës.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Kjo është për shkak të specifikimit putenv () të vetë OS.

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)

Hiq ndryshoret e mjedisit

Për të fshirë një ndryshore të mjedisit, përdorni metodën pop () të os.environ ose deklaratës del. Njësoj si fjalori.

Më poshtë është një shembull i pop ().

pop () kthen vlerën e ndryshores së mjedisit që është fshirë. Si parazgjedhje, specifikimi i një ndryshoreje të mjedisit që nuk ekziston do të rezultojë në një gabim (KeyError), por specifikimi i argumentit të dytë do të kthejë vlerën e ndryshores së mjedisit nëse nuk ekziston.

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

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

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

Më poshtë është një shembull i del.

Ndryshorja e mjedisit shtohet përsëri, dhe më pas fshihet. Nëse ndryshorja e mjedisit nuk ekziston, një gabim (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'

Ofrohet gjithashtu funksioni os.unsetenv (). Sidoqoftë, si me os.putenv (), vlera e os.environ nuk azhurnohet kur fshihet nga os.unsetenv (). Prandaj, është e preferueshme të specifikoni çelësin (emri i ndryshores së mjedisit) të os.environ dhe ta fshini atë siç tregohet në shembullin e mësipërm.

Nëse mbështetet unsetenv (), fshirja e një artikulli në os.environ do të përkthehet automatikisht në thirrjen përkatëse në unsetenv (). Në praktikë, fshirja e artikujve në os.environ është operacioni i preferuar, pasi thirrjet direkte në unsetenv () nuk do të azhurnojnë os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Fshirja e variablave të mjedisit është gjithashtu efektive vetëm brenda atij programi Python. Nuk heq variablat e mjedisit të sistemit.

Efekti i ndryshimit të variablave të mjedisit

Siç kam shkruar në mënyrë të përsëritur, ndryshimi (vendosja ose fshirja) e ndryshores së mjedisit os.environ nuk ndryshon ndryshoren e mjedisit të sistemit, por ndikon në nën-proceset që nisen në program.

Kodi i mëposhtëm nuk do të funksionojë siç pritej në Windows sepse nuk ka variabël të mjedisit LANG dhe përmbajtja e komandës së datës është e ndryshme.

Thirrja e komandës së datës në modulin e nënprocesit.

Rezultati dalës i komandës data ndryshon në varësi të vlerës së ndryshores së mjedisit 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
# 

Për hir të shpjegimit, ne kemi ndryshuar variablin e mjedisit LANG në os.environ, por Python ofron një modul lokal për të kontrolluar lokalitetin.

Kalimi i proceseve sipas variablave të mjedisit

Alsoshtë gjithashtu e mundur të kaloni procesin sipas vlerës së një ndryshoreje të mjedisit.

Këtu është një shembull i ndryshimit të daljes sipas ndryshores së mjedisit LANG në cilësimet e gjuhës. Këtu ne po përdorim metodën startwith () për të përcaktuar nëse vargu fillon me vargun e specifikuar, por nëse doni të përcaktoni përputhjen e saktë, mund të përdorni “==” për të krahasuar.

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

Përveç kësaj, nëse ndryshoret e mjedisit janë vendosur për të treguar mjedisin e zhvillimit dhe mjedisin e prodhimit, për shembull, ju mund të merrni vlerat e këtyre variablave dhe të ndryshoni procesin.

Copied title and URL