Переменные окружения можно получить, проверить, установить (добавить или перезаписать) и удалить в программах Python с помощью os.environ. Обратите внимание, что изменения, сделанные путем установки или удаления переменных окружения, действуют только в рамках программы Python. Это не означает, что системные переменные окружения будут переписаны.
Здесь представлена следующая информация.
os.environ
- Получить переменные окружения.
- Установите (добавьте\перезапишите) переменные среды
- Удалите переменные окружения
- Влияние изменения переменных условий окружающей среды
- Переключение процессов по переменным окружения
Импортируйте и используйте модуль 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
Установите (добавьте\перезапишите) переменные среды
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')
# こんにちは
Кроме того, если переменные среды установлены для обозначения среды разработки и производственной среды, например, вы можете получить значения этих переменных и переключить процесс.