Как получить доступ к переменным среды на Python

Aliaksei Yursha 30 Январь 2023 18 Апрель 2020
  1. Что такое переменные окружения
  2. Переменные окружения на Python
  3. Чтение переменных окружения на Python
  4. Добавить переменные окружения на Python
Как получить доступ к переменным среды на Python

Что такое переменные окружения

Переменные окружения - это переменные, значения которых присваиваются программе Python извне.
Разработчики обычно устанавливают их в командной строке перед обращением к исполняемому файлу Python.
Затем операционная система делает эти переменные доступными программе на Python изнутри.

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

Переменные окружения на Python

Механизм установки переменных окружения зависит от платформы. По этой причине они
доступный через встроенный модуль os компании Python, который абстрагируется от
функциональность, зависящая от операционной системы.

Во время выполнения Python все переменные окружения программы хранятся в словаре-подобно
Объект os.environ.

Обратите внимание, что объект os.environ заселяется при загрузке модуля os.environ на Python.
Если вы попробуете изменить переменные окружения после того, как факт
(например, экспортируя новую переменную окружения в терминальный эмулятор),
это не сработает.

Чтение переменных окружения на Python

Доступ к переменным окружения на Python осуществляется с помощью словарного метода
работы на объекте ос.окружающей среды.

>>> import os
>>> os.environ
environ({'HOME': '/Users/john', 'LANG': 'en_US.UTF-8', 'LOGNAME': 'john', 'OLDPWD': '/Users/john', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'PWD': '/Users/john/python-tutorial', 'SHELL': '/bin/zsh', 'TERM': 'screen', 'TERM_PROGRAM': 'Apple_Terminal', 'TERM_PROGRAM_VERSION': '433', 'TERM_SESSION_ID': 'CDC91EF3-15D6-41AD-A17B-E959D97BC4B5', 'TMPDIR': '/var/folders/md/31nwv67j113d19z0_1287f1r0000gn/T/', 'TMUX': '/private/tmp/tmux-501/default,3319,0', 'TMUX_PANE': '%28' , 'USER': 'john', '_': '/usr/local/bin/python3', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'})
>>> os.environ['HOME']
'/Users/john'
>>> os.environ['LANG']
'en_US.UTF-8'

Если вы обратитесь к переменной окружения с помощью нотации подскрипта [], и эта переменная неопределена, вы получите ошибку во время выполнения.

>>> os.environ['I_DONT_EXIST']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'I_DONT_EXIST'

Чтобы избежать этой проблемы, вы можете читать с объекта os.environ, используя интерфейс get().
Если переменная окружения не была определена, то get() возвращает None.

>>> result = os.environ.get('I_DONT_EXIST')
>>> print(result)
None

Удобство интерфейса get() заключается в том, что вы можете указать значение по умолчанию для использования
в случае, если искомая переменная окружения не существует.

>>> os.environ.get('I_DONT_EXIST', 'I_AM_DEFAULT')
'I AM DEFAULT'

Альтернативой функции os.environ.get() является использование функции os.getenv().
Обе функции работают одинаково, и к последней можно относиться как к удобному API.

Добавить переменные окружения на Python

Иногда необходимо изменить или добавить переменную окружения изнутри программы.
Например, это может случиться, если вам нужно изменить поведение вашего приложения при получении запроса на настройку сети.
Вы изменяете переменные окружения, используя оператор [] как если бы os.environ был стандартным словарем.

>>> import os
>>> os.environ['LANG']
'en_US.UTF-8'
>>> os.environ['LANG'] = 'en_GB.UTF-8'
>>> os.environ['LANG']
'en_GB.UTF-8'

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

>>> import os
>>> os.environ['LANG'] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 684, in __setitem__
    value = self.encodevalue(value)
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 754, in encode
    raise TypeError("str expected, not %s" % type(value).__name__)
TypeError: str expected, not int