Добијање, додавање, преписивање и брисање променљивих окружења у Питхону (ос.енвирон)

Бусинесс

Променљиве окружења могу се дохватити, проверити, поставити (додати или преписати) и избрисати у програмима Питхон помоћу ос.енвирон. Имајте на уму да су промене направљене постављањем или брисањем променљивих окружења ефикасне само у оквиру програма Питхон. То не значи да ће се променљиве системског окружења преписати.

Овде су наведене следеће информације.

  • os.environ
  • Набавите променљиве окружења.
  • Поставите (додајте/препишите) променљиве окружења
  • Уклоните променљиве окружења
  • Ефекат промене променљивих окружења
  • Пребацивање процеса према променљивим окружења

Увезите и користите ос модул. Пошто је то стандардна библиотека, није потребна додатна инсталација. Модул потпроцеса је такође укључен у стандардну библиотеку.

import os
import subprocess

ос.енвирон

Тип ос.енвирон је ос._Енвирон.

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

ос._Енвирон је објект типа карте са паром кључа и вредности и има исте методе као и речник (тип дицт). Назив променљиве окружења је кључ, а његова вредност је вредност.

Садржај ос.енвирон -а ће се учитати када се ос модул увезе. Садржај ос.енвирон неће бити ажуриран чак и ако се променљиве системског окружења промене на неки други начин док је програм у току.

Листа се приказује штампањем ().

# print(os.environ)

Као и у рјечнику, можете користити сљедеће методе или употријебити у за провјеру постојања кључева и вриједности.

  • keys()
  • values()

Обрада кључева и вредности је у основи иста као и за речнике. Примери су дати испод.

Набавите променљиве окружења.

os.environ[Environment variable name]
Ово ће вам омогућити да добијете вредност променљиве окружења, али ако наведете име променљиве окружења које не постоји, добићете грешку (КеиЕррор).

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

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

Метода гет () ос.енвирон може се користити за добијање подразумеване вредности ако не постоји. Ово је исто што и речник.

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

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

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

Такође је обезбеђена функција ос.гетенв (). Као и гет () метода речника, враћа подразумевану вредност ако кључ не постоји. Ова функција је корисна ако само желите да добијете и проверите вредност променљиве окружења.

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

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

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

Поставите (додајте/препишите) променљиве окружења

os.environ[Environment variable name]
Додељивањем вредности овоме, можете поставити променљиву окружења.

Када се наведе ново име променљиве окружења, променљива окружења се додаје ново, а када се наведе назив постојеће променљиве окружења, вредност променљиве окружења се преписује.

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

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

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

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

Имајте на уму да ће додељивање било чега осим низа резултирати грешком (ТипеЕррор). Ако желите да доделите нумеричку вредност, наведите је као низ.

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

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

Такође је обезбеђена функција ос.путенв (). Међутим, вредност ос.енвирон се не ажурира када је постављена ос.путенв (). Из тог разлога, пожељно је навести кључ (назив променљиве окружења) ос.енвирон и доделити вредност као што је приказано у горњем примеру.

Ако је подржан путенв (), додељивање ставки у ос.енвиронменту ће се аутоматски претворити у одговарајући позив у путенв (). У пракси, додељивање ставке у ос.енвиронну је пожељна операција, јер директан позив на путенв () неће ажурирати ос.енвирон.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Као што је раније поменуто, промене направљене додавањем или преписивањем променљивих окружења су ефикасне само у оквиру програма Питхон. То не значи да ће се променљиве системског окружења преписати.

Имајте на уму да промена вредности може изазвати цурење меморије у зависности од оперативног система.

Напомена: На неким платформама, укључујући ФрееБСД и Мац ОС Кс, промена вредности окружења може изазвати цурење меморије.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

То је због спецификације путенв () самог ОС -а.

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)

Уклоните променљиве окружења

Да бисте избрисали променљиву окружења, користите методу поп () ос.енвирон или наредбу дел. Исто као и речник.

Следи пример поп ().

поп () враћа вредност променљиве окружења која је избрисана. Подразумевано, навођење променљиве окружења која не постоји резултираће грешком (КеиЕррор), али навођење другог аргумента ће вратити вредност променљиве окружења ако не постоји.

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

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

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

Следи пример дел.

Променљива окружења се поново додаје, а затим брише. Ако променљива окружења не постоји, грешка (КеиЕррор).

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'

Такође је обезбеђена функција ос.унсетенв (). Међутим, као и код ос.путенв (), вредност ос.енвирон се не ажурира када га обрише ос.унсетенв (). Због тога је пожељно навести кључ (назив променљиве окружења) ос.енвирон и избрисати га као што је приказано у горњем примеру.

Ако је подржан унсетенв (), брисање ставке у ос.енвиронну ће се аутоматски превести у одговарајући позив у унсетенв (). У пракси, брисање ставки у ос.енвиронну је пожељна операција, јер директни позиви на унсетенв () неће ажурирати ос.енвирон.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Брисање променљивих окружења је такође ефикасно само у оквиру тог програма Питхон. Не уклања варијабле системског окружења.

Ефекат промене променљивих окружења

Као што сам више пута писао, промена (подешавање или брисање) променљиве окружења ос.енвиронмена не мења променљиву окружења система, али утиче на подпроцесе који се покрећу у програму.

Следећи код неће радити како се очекује у оперативном систему Виндовс јер не постоји ЛАНГ променљива окружења и садржај наредбе дате је другачији.

Позивање наредбе дате у модулу потпроцеса.

Излазни резултат наредбе дате се мења у зависности од вредности променљиве ЛАНГ окружења.

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
# 

Ради објашњења, променили смо променљиву ЛАНГ окружења у ос.енвирон, али Питхон пружа језички модул за контролу локализације.

Пребацивање процеса према променљивим окружења

Такође је могуће променити процес према вредности променљиве окружења.

Ево примера промене излаза према променљивој ЛАНГ окружења у језичким поставкама. Овде користимо методу стартвитх () да одредимо да ли низ почиње са наведеним низом, али ако желите да одредите потпуно подударање, можете упоредити „==“.

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

Осим тога, ако су, на пример, променљиве окружења постављене да указују на развојно окружење и производно окружење, можете добити вредности ових променљивих и променити процес.

Copied title and URL