Að fá, bæta við, skrifa yfir og eyða umhverfisbreytum í Python (os.environ)

Viðskipti

Umhverfisbreytur er hægt að sækja, athuga, setja (bæta við eða skrifa yfir) og eyða í Python forritum með því að nota os.environ. Athugið að breytingar sem gerðar eru með því að setja eða eyða umhverfisbreytum hafa aðeins áhrif á Python forritið. Það þýðir ekki að kerfisumhverfisbreyturnar verði endurskrifaðar.

Eftirfarandi upplýsingar eru veittar hér.

  • os.environ
  • Fáðu umhverfisbreytur.
  • Stilltu (bæta við/skrifa yfir) umhverfisbreytur
  • Fjarlægðu umhverfisbreytur
  • Áhrif breytinga á umhverfisbreytum
  • Skipt um ferli eftir umhverfisbreytum

Flytja inn og nota os eininguna. Þar sem það er staðlað bókasafn er engin viðbótaruppsetning nauðsynleg. Undirvinnslueiningin er einnig innifalin í venjulegu bókasafninu.

import os
import subprocess

os.environ

Tegund os.environ er os._Environ.

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

os._Environ er hlutur af kortagerð með lyklapar og gildi og hefur sömu aðferðir og orðabók (dict type). Umhverfisbreytileikinn er lykillinn og gildi hennar er gildi.

Innihald os.environ verður hlaðið þegar os einingin er flutt inn. Innihald os.environ verður ekki uppfært þó kerfisumhverfisbreytum sé breytt með öðrum hætti meðan forritið er í gangi.

Listinn birtist með prentun ().

# print(os.environ)

Eins og með orðabókina geturðu notað eftirfarandi aðferðir eða notað inn til að athuga hvort lyklar og gildi séu til staðar.

  • keys()
  • values()

Vinnsla lykla og gilda er í grundvallaratriðum sú sama og fyrir orðabækur. Dæmi eru gefin hér að neðan.

Fáðu umhverfisbreytur.

os.environ[Environment variable name]
Þetta gerir þér kleift að fá gildi umhverfisbreytunnar, en ef þú tilgreinir umhverfisbreytingarheiti sem er ekki til, þá færðu villu (KeyError).

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

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

Get () aðferðina við os.environ er hægt að nota til að fá sjálfgefið gildi ef það er ekki til. Þetta er líka það sama og orðabókin.

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

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

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

Aðgerðin os.getenv () er einnig veitt. Eins og get () aðferð orðabókarinnar skilar hún sjálfgefnu gildi ef lykillinn er ekki til. Þessi aðgerð er gagnleg ef þú vilt bara fá og athuga gildi umhverfisbreytu.

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

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

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

Stilltu (bæta við/skrifa yfir) umhverfisbreytur

os.environ[Environment variable name]
Með því að úthluta þessu gildi geturðu stillt umhverfisbreytu.

Þegar nýtt umhverfisbreytanafn er tilgreint er umhverfisbreytunni bætt nýlega við og þegar fyrirliggjandi umhverfisbreytanafn er tilgreint er gildi umhverfisbreytunnar skrifað yfir.

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

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

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

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

Athugaðu að úthlutun annars en strengs mun leiða til villu (TypeError). Ef þú vilt úthluta tölulegu gildi, tilgreindu það sem streng.

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

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

Aðgerðin os.putenv () er einnig veitt. Gildi os.environ er hins vegar ekki uppfært þegar það er stillt af os.putenv (). Af þessum sökum er æskilegra að tilgreina lykilinn (umhverfisbreytingarheiti) os.environ og úthluta gildinu eins og sýnt er í dæminu hér að ofan.

Ef putenv () er studd, verður úthlutun á hlut í os.environ sjálfkrafa breytt í samsvarandi símtal til putenv (). Í reynd er úthlutun á hlut í os.environ ákjósanleg aðgerð, þar sem beint símtal til putenv () mun ekki uppfæra os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Eins og fyrr segir hafa breytingar sem gerðar eru með því að bæta við eða skrifa yfir umhverfisbreytur aðeins áhrif innan Python forritsins. Það þýðir ekki að kerfisumhverfisbreyturnar verði endurskrifaðar.

Athugið að breyting á gildinu getur valdið minni leka eftir stýrikerfi.

Athugið: Á sumum kerfum, þar á meðal FreeBSD og Mac OS X, getur breytt umhverfisgildi valdið minni leka.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Þetta er vegna putenv () forskriftar OS sjálfu.

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)

Fjarlægðu umhverfisbreytur

Til að eyða umhverfisbreytu skaltu nota pop () aðferðina á os.environ eða del setningunni. Sama og orðabók.

Eftirfarandi er dæmi um popp ().

pop () skilar verðmæti umhverfisbreytunnar sem var eytt. Sjálfgefið er að tilgreina umhverfisbreytu sem er ekki til mun leiða til villu (KeyError), en að tilgreina seinni rökin skilar gildi umhverfisbreytunnar ef hún er ekki til.

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

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

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

Eftirfarandi er dæmi um del.

Umhverfisbreytunni er bætt við aftur og síðan eytt. Ef umhverfisbreytan er ekki til, villa (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'

Aðgerðin os.unsetenv () er einnig veitt. Hins vegar, eins og með os.putenv (), er gildi os.environ ekki uppfært þegar því er eytt af os.unsetenv (). Þess vegna er æskilegt að tilgreina lykilinn (umhverfisbreytingarheiti) os.environ og eyða honum eins og sýnt er í dæminu hér að ofan.

Ef unsetenv () er stutt, mun eyða hlut í os.environ sjálfkrafa þýða í samsvarandi símtal til unsetenv (). Í reynd er eyðing atriða í os.environ ákjósanleg aðgerð þar sem bein símtöl til unsetenv () munu ekki uppfæra os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Að eyða umhverfisbreytum hefur einnig aðeins áhrif á það Python forrit. Það fjarlægir ekki kerfisumhverfisbreytur.

Áhrif breytinga á umhverfisbreytum

Eins og ég hef skrifað ítrekað, breytir (stillir eða eyðir) umhverfisbreytan os.environ breytir ekki kerfisumhverfisbreytunni, en hún hefur áhrif á undirferla sem eru settir af stað í forritinu.

Eftirfarandi kóði mun ekki virka eins og búist var við í Windows vegna þess að það er engin LANG umhverfisbreyting og innihald dagsetningarskipunarinnar er öðruvísi.

Hringir í dagsetningarskipunina í undirvinnslueiningunni.

Framleiðsla niðurstaðnar dagsetningarskipunarinnar breytist eftir gildum LANG umhverfisbreytunnar.

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
# 

Til skýringar höfum við breytt LANG umhverfisbreytunni í os.environ, en Python veitir staðareiningu til að stjórna staðsetningunni.

Skipt um ferli eftir umhverfisbreytum

Það er einnig hægt að breyta ferlinu í samræmi við gildi umhverfisbreytu.

Hér er dæmi um að breyta framleiðslunni í samræmi við LANG umhverfisbreytuna í tungumálastillingunum. Hér erum við að nota startswith () aðferðina til að ákvarða hvort strengurinn byrjar með tilgreindum strengi, en ef þú vilt ákvarða nákvæmlega samsvörun geturðu notað „==“ til að bera saman.

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

Að auki, ef umhverfisbreytur eru settar til að gefa til kynna þróunarumhverfi og framleiðsluumhverfi, til dæmis, geturðu fengið gildi þessara breytna og skipt um ferli.