Получение, добавление, перезапись и удаление переменных окружения в Python (os.environ)

Бизнес

Переменные окружения можно получить, проверить, установить (добавить или перезаписать) и удалить в программах 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')
# こんにちは

Кроме того, если переменные среды установлены для обозначения среды разработки и производственной среды, например, вы можете получить значения этих переменных и переключить процесс.

Copied title and URL