Зменныя асяроддзя можна атрымаць, праверыць, усталяваць (дадаць або перазапісаць) і выдаліць у праграмах Python з дапамогай os.environ. Звярніце ўвагу, што змены, унесеныя шляхам налады або выдалення зменных асяроддзя, дзейнічаюць толькі ў праграме Python. Гэта не значыць, што зменныя сістэмнага асяроддзя будуць перапісаны.
Тут прадстаўлена наступная інфармацыя.
os.environ
- Атрымаць зменныя асяроддзя.
- Усталяваць (дадаць/перазапісаць) зменныя асяроддзя
- Выдаліць зменныя асяроддзя
- Эфект змянення зменных асяроддзя
- Пераключэнне працэсаў па зменных асяроддзя
Імпартаваць і выкарыстоўваць модуль os. Паколькі гэта стандартная бібліятэка, дадатковая ўстаноўка не патрабуецца. Модуль падпрацэса таксама ўваходзіць у стандартную бібліятэку.
import os
import subprocess
os.environ
Тып os.environ – os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ – гэта аб’ект тыпу карты з парай ключоў і значэнняў і мае тыя ж метады, што і слоўнік (тып dict). Імя зменнай асяроддзя з’яўляецца ключавым, а яго значэнне – значэннем.
Змесціва os.environ будзе загружацца пры імпарце модуля os. Змест os.environ не будзе абнаўляцца, нават калі зменныя сістэмнага асяроддзя змяняюцца іншымі спосабамі падчас працы праграмы.
Спіс адлюстроўваецца з дапамогай print ().
# print(os.environ)
Як і ў слоўніку, вы можаце скарыстацца наступнымі метадамі або скарыстацца ў, каб праверыць наяўнасць ключоў і значэнняў.
keys()
values()
Апрацоўка ключоў і значэнняў у асноўным такая ж, як і ў слоўніках. Прыклады прыведзены ніжэй.
Атрымаць зменныя асяроддзя.
os.environ[Environment variable name]
Гэта дазволіць вам атрымаць значэнне зменнай асяроддзя, але калі вы ўкажаце імя зменнай асяроддзя, якое не існуе, вы атрымаеце памылку (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Метад get () os.environ можа быць выкарыстаны для атрымання значэння па змаўчанні, калі яно не існуе. Гэта таксама тое ж самае, што і слоўнік.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Таксама прадугледжана функцыя os.getenv (). Як і метад слоўніка get (), ён вяртае значэнне па змаўчанні, калі ключ не існуе. Гэтая функцыя карысная, калі вы проста хочаце атрымаць і праверыць значэнне зменнай асяроддзя.
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
Звярніце ўвагу, што прызначэнне чаго -небудзь, акрамя радка, прывядзе да памылкі (TypeError). Калі вы хочаце прысвоіць лікавае значэнне, пакажыце яго як радок.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Таксама прадугледжана функцыя os.putenv (). Аднак значэнне os.environ не абнаўляецца, калі яно зададзена os.putenv (). Па гэтай прычыне пераважней паказаць ключ (імя зменнай асяроддзя) os.environ і прызначыць значэнне, як паказана ў прыведзеным вышэй прыкладзе.
Калі putenv () падтрымліваецца, прызначэнне элемента ў os.environ аўтаматычна будзе пераўтворана ў адпаведны выклік putenv (). На практыцы прызначэнне элемента ў os.environ з’яўляецца пераважнай аперацыяй, паколькі прамы выклік putenv () не абнаўляе os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Як ужо згадвалася раней, змены, унесеныя шляхам дадання або перазапісу зменных асяроддзя, дзейнічаюць толькі ў праграме Python. Гэта не значыць, што зменныя сістэмнага асяроддзя будуць перапісаны.
Звярніце ўвагу, што змяненне значэння можа выклікаць уцечку памяці ў залежнасці ад АС.
Заўвага: На некаторых платформах, у тым ліку FreeBSD і Mac OS X, змяненне значэння асяроддзя можа выклікаць уцечку памяці.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Гэта звязана са спецыфікацыяй putenv () самой АС.
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)
Выдаліць зменныя асяроддзя
Каб выдаліць зменную асяроддзя, выкарыстоўвайце метад pop () os.environ або аператар del. Тое самае, што і слоўнік.
Ніжэй прыведзены прыклад pop ().
pop () вяртае значэнне зменнай асяроддзя, якая была выдалена. Па змаўчанні ўказанне зменнай асяроддзя, якая не існуе, прывядзе да памылкі (KeyError), але ўказанне другога аргумента верне значэнне зменнай асяроддзя, калі яна не існуе.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Ніжэй прыведзены прыклад del.
Зменная асяроддзя дадаецца зноўку, а затым выдаляецца. Калі зменная асяроддзя не існуе, узнікае памылка (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'
Таксама прадугледжана функцыя os.unsetenv (). Аднак, як і ў выпадку os.putenv (), значэнне os.environ не абнаўляецца пры выдаленні os.unsetenv (). Такім чынам, пераважней паказаць ключ (імя зменнай асяроддзя) os.environ і выдаліць яго, як паказана ў прыведзеным вышэй прыкладзе.
Калі unsetenv () падтрымліваецца, выдаленне элемента ў os.environ аўтаматычна перакладаецца на адпаведны выклік unsetenv (). На практыцы выдаленне элементаў у os.environ з’яўляецца пераважнай аперацыяй, паколькі прамыя выклікі unsetenv () не абнаўляюць os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Выдаленне зменных асяроддзя таксама эфектыўна толькі ў гэтай праграме Python. Гэта не выдаляе зменныя асяроддзя сістэмы.
Эфект змянення зменных асяроддзя
Як я ўжо пісаў неаднаразова, змяненне (настройка або выдаленне) зменнай асяроддзя os.environ не змяняе зменную сістэмнага асяроддзя, але ўплывае на падпрацэсы, якія запускаюцца ў праграме.
Наступны код не будзе працаваць належным чынам у Windows, таму што няма зменнай асяроддзя LANG і змесціва каманды даты адрозніваецца.
Выклік каманды даты ў модулі падпрацэса.
Вывадны вынік каманды date змяняецца ў залежнасці ад значэння зменнай асяроддзя 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
#
Дзеля тлумачэння мы змянілі зменную асяроддзя LANG у os.environ, але Python забяспечвае модуль лакалі для кантролю лакалі.
Пераключэнне працэсаў па зменных асяроддзя
Таксама можна пераключыць працэс у адпаведнасці са значэннем зменнай асяроддзя.
Вось прыклад змены вываду ў адпаведнасці са зменнай асяроддзя LANG у наладах мовы. Тут мы выкарыстоўваем метад startwith (), каб вызначыць, пачынаецца Ці радок з названай радка, але калі вы хочаце вызначыць дакладнае супадзенне, вы можаце выкарыстоўваць “==” для параўнання.
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')
# こんにちは
Акрамя таго, калі зменныя асяроддзя ўстаноўлены, напрыклад, для абазначэння асяроддзя распрацоўкі і вытворчага асяроддзя, вы можаце атрымаць значэнні гэтых зменных і пераключыць працэс.