Ang mga variable ng kapaligiran ay maaaring makuha, suriin, itakda (naidagdag o na-overtake), at tinanggal sa mga programa ng Python gamit ang os.en environment. Tandaan na ang mga pagbabagong ginawa sa pamamagitan ng pagtatakda o pagtanggal ng mga variable ng kapaligiran ay epektibo lamang sa loob ng programa ng Python. Hindi ito nangangahulugan na ang mga variable ng kapaligiran sa system ay muling susulat.
Ang sumusunod na impormasyon ay ibinigay dito.
os.environ
- Kumuha ng mga variable ng kapaligiran.
- Itakda (idagdag / patungan) ang mga variable ng kapaligiran
- Alisin ang mga variable ng kapaligiran
- Epekto ng pagbabago ng mga variable ng kapaligiran
- Ang paglipat ng mga proseso ayon sa mga variable ng kapaligiran
I-import at gamitin ang os module. Dahil ito ay isang pamantayang aklatan, walang kinakailangang karagdagang pag-install. Ang module ng subprocess ay kasama rin sa karaniwang silid aklatan.
import os
import subprocess
os.en environment
Ang uri ng os.en environment ay os._En environment.
print(type(os.environ))
# <class 'os._Environ'>
Ang os._En environment ay isang uri ng uri ng mapa na may isang pares ng susi at halaga, at may parehong pamamaraan bilang isang diksyunaryo (uri ng dikta). Ang pangalan ng variable ng kapaligiran ay susi, at ang halaga nito ay halaga.
Ang mga nilalaman ng os.en environment ay mai-load kapag ang os module ay na-import. Ang mga nilalaman ng os.en environment ay hindi maa-update kahit na ang mga variable ng kapaligiran sa system ay binago ng iba pang mga paraan habang tumatakbo ang programa.
Ang listahan ay ipinapakita na may print ().
# print(os.environ)
Tulad ng sa diksyunaryo, maaari mong gamitin ang mga sumusunod na pamamaraan, o gamitin upang suriin ang pagkakaroon ng mga susi at halaga.
keys()
values()
Ang pagproseso ng mga susi at halaga ay karaniwang kapareho ng para sa mga dictionary. Ang mga halimbawa ay ibinibigay sa ibaba.
Kumuha ng mga variable ng kapaligiran.
os.environ[Environment variable name]
Papayagan ka nitong makuha ang halaga ng variable ng kapaligiran, ngunit kung tumutukoy ka ng isang pangalan ng variable ng kapaligiran na wala, makakakuha ka ng isang error (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Ang get () na pamamaraan ng os.en environment ay maaaring magamit upang makuha ang default na halaga kung wala ito. Pareho din ito sa diksyunaryo.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Ang pagpapaandar os.getenv () ay ibinigay din. Tulad ng paraan ng get () ng diksyonaryo, ibinabalik nito ang default na halaga kung wala ang susi. Kapaki-pakinabang ang pagpapaandar na ito kung nais mo lamang makuha at suriin ang halaga ng isang variable ng kapaligiran.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Itakda (idagdag / patungan) ang mga variable ng kapaligiran
os.environ[Environment variable name]
Sa pamamagitan ng pagtatalaga ng isang halaga dito, maaari kang magtakda ng isang variable ng kapaligiran.
Kapag ang isang bagong pangalan ng variable ng kapaligiran ay tinukoy, ang variable ng kapaligiran ay bagong idinagdag, at kapag ang isang umiiral na pangalan ng variable ng kapaligiran ay tinukoy, ang halaga ng variable ng kapaligiran ay na-o-overtake.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Tandaan na ang pagtatalaga ng anumang bagay maliban sa isang string ay magreresulta sa isang error (TypeError). Kung nais mong magtalaga ng isang numerong halaga, tukuyin ito bilang isang string.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Ang pagpapaandar os.putenv () ay ibinigay din. Gayunpaman, ang halaga ng os.en environment ay hindi na-update kapag ito ay itinakda ng os.putenv (). Para sa kadahilanang ito, mas mabuti na tukuyin ang susi (pangalan ng variable ng kapaligiran) ng os.en environment at italaga ang halaga tulad ng ipinakita sa halimbawa sa itaas.
Kung sinusuportahan ang putenv (), isang pagtatalaga sa isang item sa os.en environment ay awtomatikong maio-convert sa isang kaukulang tawag sa putenv (). Sa pagsasagawa, ang pagtatalaga sa isang item sa os.en environment ay ang ginustong operasyon, dahil ang isang direktang tawag sa putenv () ay hindi maa-update ang os.en environment.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Tulad ng nabanggit kanina, ang mga pagbabagong ginawa sa pamamagitan ng pagdaragdag o pag-o-overtake ng mga variable ng kapaligiran ay epektibo lamang sa loob ng programa ng Python. Hindi ito nangangahulugan na ang mga variable ng kapaligiran sa system ay muling susulat.
Tandaan na ang pagbabago ng halaga ay maaaring maging sanhi ng isang pagtagas ng memorya depende sa OS.
Tandaan: Sa ilang mga platform, kabilang ang FreeBSD at Mac OS X, ang pagbabago ng halaga ng kapaligiran ay maaaring maging sanhi ng isang butas ng memorya.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Ito ay dahil sa pagtutukoy ng putenv () ng mismong 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)
Alisin ang mga variable ng kapaligiran
Upang tanggalin ang isang variable ng kapaligiran, gamitin ang pop () na paraan ng os.en environment o ang del statement. Parehas sa diksyunaryo.
Ang sumusunod ay isang halimbawa ng pop ().
ibabalik ng pop () ang halaga ng variable ng kapaligiran na tinanggal. Bilang default, ang pagtukoy ng isang variable ng kapaligiran na hindi mayroon ay magreresulta sa isang error (KeyError), ngunit ang pagtukoy sa pangalawang argumento ay ibabalik ang halaga ng variable ng kapaligiran kung wala ito.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Ang sumusunod ay isang halimbawa ng del.
Ang variable ng kapaligiran ay idinagdag muli, at pagkatapos ay tinanggal. Kung ang variable ng kapaligiran ay hindi umiiral, isang error (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'
Ang function os.unsetenv () ay ibinigay din. Gayunpaman, tulad ng sa os.putenv (), ang halaga ng os.en environment ay hindi na-update kapag ito ay tinanggal ng os.unsetenv (). Samakatuwid, mas mabuti na tukuyin ang susi (pangalan ng variable ng kapaligiran) ng os.en environment at tanggalin ito tulad ng ipinakita sa halimbawa sa itaas.
Kung sinusuportahan ang unsetenv (), ang pagtanggal ng isang item sa os.en environment ay awtomatikong isasalin sa kaukulang tawag sa unsetenv (). Sa pagsasagawa, ang pagtanggal ng mga item sa os.en environment ay ang ginustong operasyon, dahil ang mga direktang tawag sa unsetenv () ay hindi maa-update ang os.en environment.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Ang pagtanggal ng mga variable ng kapaligiran ay epektibo lamang sa loob ng programang Python na iyon. Hindi nito tinatanggal ang mga variable ng kapaligiran sa system.
Epekto ng pagbabago ng mga variable ng kapaligiran
Tulad ng isinulat ko nang paulit-ulit, ang pagbabago (setting o pagtanggal) ng variable ng kapaligiran ng os.en environment ay hindi binabago ang variable ng kapaligiran ng system, ngunit nakakaapekto ito sa mga sub-proseso na inilunsad sa programa.
Ang sumusunod na code ay hindi gagana tulad ng inaasahan sa Windows dahil walang variable sa kapaligiran ng LANG at ang mga nilalaman ng utos ng petsa ay magkakaiba.
Ang pagtawag sa utos ng petsa sa module ng subprocess.
Ang resulta ng output ng petsa ng utos ay nagbabago depende sa halaga ng variable ng kapaligiran ng 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
#
Para sa kapakanan ng paliwanag, binago namin ang variable ng kapaligiran ng LANG sa os.en environment, ngunit nagbibigay ang Python ng isang lokal na module upang makontrol ang lokal.
Ang paglipat ng mga proseso ayon sa mga variable ng kapaligiran
Posible ring ilipat ang proseso ayon sa halaga ng isang variable ng kapaligiran.
Narito ang isang halimbawa ng pagbabago ng output ayon sa variable ng kapaligiran ng LANG sa mga setting ng wika. Narito ginagamit namin ang startswith () na pamamaraan upang matukoy kung ang string ay nagsisimula sa tinukoy na string, ngunit kung nais mong matukoy ang eksaktong tugma, maaari mong gamitin ang “==” upang ihambing.
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')
# こんにちは
Bilang karagdagan, kung ang mga variable ng kapaligiran ay itinakda upang ipahiwatig ang kapaligiran sa pag-unlad at ang kapaligiran sa produksyon, halimbawa, maaari mong makuha ang mga halaga ng mga variable na ito at ilipat ang proseso.