Променливите на средата могат да бъдат извличани, проверявани, задавани (добавяни или презаписвани) и изтривани в програмите на Python с помощта на os.environ. Имайте предвид, че промените, направени чрез задаване или изтриване на променливи на средата, са ефективни само в рамките на програмата на Python. Това не означава, че системните променливи на средата ще бъдат пренаписани.
Тук се предоставя следната информация.
os.environ
- Получаване на променливи на средата.
- Задаване (add\overwrite) на променливи на средата
- Премахване на променливи на средата
- Ефект от промяната на променливите на средата
- Превключване на процеси чрез променливи на средата
Импортиране и използване на модула os. Тъй като той е стандартна библиотека, не е необходима допълнителна инсталация. Модулът subprocess също е включен в стандартната библиотека.
import os
import subprocess
os.environ
Типът на os.environ е os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ е обект от тип map с двойка ключ и стойност и има същите методи като речник (тип dict). Името на променливата на средата е key (ключ), а нейната стойност е value (стойност).
Съдържанието на os.environ ще бъде заредено при импортирането на модула os. Съдържанието на os.environ няма да бъде актуализирано, дори ако променливите на системната среда бъдат променени по друг начин, докато програмата работи.
Списъкът се показва с print().
# print(os.environ)
Както и при речника, можете да използвате следните методи или да използвате in, за да проверите наличието на ключове и стойности.
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
Задаване (add\overwrite) на променливи на средата
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, промяната на стойността на environ може да доведе до изтичане на памет.
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 е различно.
Извикване на командата date в модула на подпроцеса.
Изходният резултат на командата 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 предоставя модул locale за управление на локала.
Превключване на процеси чрез променливи на средата
Възможно е също така да превключвате процеса в зависимост от стойността на променлива на средата.
Ето един пример за промяна на изхода в зависимост от променливата на средата LANG в езиковите настройки. Тук използваме метода startswith(), за да определим дали низът започва с посочения низ, но ако искате да определите точното съвпадение, можете да използвате „==“ за сравнение.
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')
# こんにちは
Освен това, ако променливите на средата са зададени така, че да указват например средата за разработка и производствената среда, можете да получите стойностите на тези променливи и да превключите процеса.