Переменные окружения Linux в Python3

newbie

Опубликован:  2018-10-12T06:10:06.253348Z

Переменные окружения Linux предоставляют простой и надёжный способ хранить и передавать настройки различным приложениям в системе. При разработке web-приложений с Python3, когда код приложения хранится в открытом git-репозитории, использование переменных окружения позволяет скрыть приватные данные в конфигурационных файлах разрабатываемого приложения. Ниже речь пойдёт о переменных окружения и методах получения данных из переменных окружения в коде Python-программ.

Детальная информация о переменных окружения изложена на wiki.archlinux.org, статья описывает виды переменных окружения, способы их создания, изменения и удаления. Отмечу основные тезисы. Полный список доступных в системе переменных окружения можно посмотреть при помощи команд printenv и env. Если имя переменной окружения известно, то echo даёт возможность получить хранящееся в ней значение.

newbie@stretch:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
newbie@stretch:~$ 

Создать переменную окружения в текущем сеансе можно при помощи команды export.

newbie@stretch:~$ export ABCD=abcd
newbie@stretch:~$ 

После создания переменной окружения она сразу становится доступной для использования в этом сеансе.

newbie@stretch:~$ echo $ABCD
abcd
newbie@stretch:~$ 

2WXkHfek6G.png

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

newbie@stretch:~$ export ABCD='here is the deal'
newbie@stretch:~$ echo $ABCD
here is the deal
newbie@stretch:~$ 

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

hgTj7oJ9fd.png

После сохранения файла и выхода из текстового редактора следует обновить сессию.

newbie@stretch:~$ source ~/.bashrc 
newbie@stretch:~$ 

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

newbie@stretch:~$ echo $ABCD
this variable is permanent
newbie@stretch:~$ 

Теперь следует рассмотреть способ доступа к переменным окружения в python-коде.

scJlXbPZni.png

Модуль os стандартной библиотеки даёт возможность просмотреть все доступные в системе переменные окружения.

>>> import os
>>> for i in os.environ:
...     print(i)
... 
XDG_DATA_HOME
XDG_SESSION_PATH
XDG_CURRENT_DESKTOP
LS_COLORS
XDG_SESSION_DESKTOP
TERM
XDG_SESSION_ID
LOGNAME
XDG_SEAT
DISPLAY
XDG_GREETER_DATA_DIR
XDG_VTNR
QT_LINUX_ACCESSIBILITY_ALWAYS_ON
DESKTOP_SESSION
_
SHELL
XDG_SESSION_TYPE
GPG_AGENT_INFO
PATH
DBUS_SESSION_BUS_ADDRESS
SSH_AUTH_SOCK
XDG_SEAT_PATH
SHLVL
LANG
XDG_CONFIG_HOME
_LXSESSION_PID
SAL_USE_VCLPLUGIN
PWD
GTK_MODULES
GDM_LANG
XDG_MENU_PREFIX
SSH_AGENT_PID
ABCD
USER
XDG_CONFIG_DIRS
HOME
XDG_RUNTIME_DIR
XAUTHORITY
QT_ACCESSIBILITY
XDG_DATA_DIRS
GDMSESSION
>>> 

Если имя переменной окружения известно, то не составляет труда получить её значение, как из обычного словаря при помощи метода get.

>>> os.environ.get('ABCD')
'this variable is permanent'
>>> 

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

>>> os.getenv('ABCD')
'this variable is permanent'
>>> 

Если переменная окружения не существует, то можно задать возвращаемое функцией значение в этом случае.

>>> os.getenv('BADNAME', 'not found')
'not found'
>>> 

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

import os


class Config:
    SECRET_KEY = os.getenv('SECRET_KEY') 

В результате чего открытый репозиторий не будет содержать значение секретного ключа. Получается что, чтобы не "светить" приватные данные типа явок и паролей в открытом git-репозитории, переменные окружения Linux являются наилучшим местом их хранения.

Метки:  linux, python3x, stdlib, os
Комментарии: