Перейти к содержимому

Как проверить доступность переменных окружения python

  • автор:

Переменные окружения — Основы командной строки

Команда cd без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?

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

Эта команда ориентируется на так называемую переменную окружения, которую мы изучим в этом уроке.

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

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

Посмотреть установленные переменные можно командой env (environment). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:

env TERM=xterm-256color SHELL=/bin/bash LC_ALL=en_US.UTF-8 USER=kirill.m HEXLET_VERSION=v2711 PATH=/home/kirill.m/bin:/home/kirill.m/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin PWD=/home/kirill.m LANG=en_US.UTF-8 SHLVL=1 HOME=/home/kirill.m LOGNAME=kirill.m 

Формат вывода очень простой: слева от знака равно расположено имя переменной, справа — значение. В вашем случае вывод команды env будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION , но наверняка будет HOME , только с другим значением.

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

Возьмем для примера ту же команду cd . Она знает лишь то, что домашняя директория доступна в переменной окружения HOME . Как она попала в систему — не важно.

Без переменной окружения пришлось бы делать одну из двух вещей:

  • При вызове cd каждый раз указывать, где находится домашняя директория. Например, так: cd —home-dir /home/kirill.m . Такой способ убивает весь смысл быстрого перехода в домашнюю директорию
  • Договариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой cd при каждом запуске

Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это HOME :

# Для вывода переменной используется echo, # а перед самой переменной ставится знак $ echo $HOME /home/kirill.m # Вокруг знака `=` не должно быть пробелов HOME=/tmp echo $HOME /tmp # Возвращаем обратно HOME=/home/kirill.m echo $HOME /home/kirill.m 

Теперь проведем эксперимент: попробуем установить HOME и выполнить переход в эту директорию с помощью команды cd , которая должна отправить нас в домашнюю директорию:

# Достаточно выполнить присваивание слева от запускаемой команды HOME=/tmp cd /tmp pwd /tmp 

Команда cd выполнила переход по пути, указанном в переменной HOME . Теперь снова сделаем cd , но не добавляя определение переменной слева:

cd pwd /home/kirill.m echo $HOME /home/kirill.m 

В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный.

Когда мы указали HOME=/tmp прямо перед командой cd , то переменная не была изменена для текущей сессии — она была изменена для запущенной команды, в данном случае cd . Такой трюк можно проделывать с любой командой.

Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:

echo $HOME /home/kirill.m export HOME=/tmp cd pwd /tmp echo $HOME /tmp 

Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.

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

Самостоятельная работа

Изучите переменные окружения в вашей локальной среде, набрав команду env .

Дополнительные материалы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

  • Статья «Как учиться и справляться с негативными мыслями»
  • Статья «Ловушки обучения»
  • Статья «Сложные простые задачи по программированию»
  • Вебинар « Как самостоятельно учиться »

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Переменные среды окружения системы (environment)

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

Содержание:

  • Переменная os.environ ,
  • Функция os.supports_bytes_environ ,
  • Переменная os.environb ,
  • Функция os.getenv() ,
  • Функция os.getenvb() ,
  • Функция os.putenv() ,
  • Функция os.unsetenv() ,
  • Функция os.get_exec_path() .
os.environ :

Переменная os.environ это объект сопоставления, подобный словарю, который представляет переменные среды окружения системы. Например, os.environ[‘HOME’] это путь к домашнему каталогу на некоторых платформах и эквивалентен getenv(«HOME») в языке C .

Переменная os.environ фиксируется при первом импорте модуля os , во время запуска Python. Изменения в среде OS, сделанные после этого времени, не отражаются os.environ , за исключением изменений, внесенных путем непосредственного изменения os.environ .

Если платформа поддерживает функцию os.putenv() , то сопоставление os.environ может использовать ее для изменения среды. Функция os.putenv() будет вызываться автоматически при изменении os.environ .

Если платформа не поддерживает функцию os.putenv() , то измененная копия сопоставления os.environ может быть передана соответствующим функциям создания процессов, чтобы заставить дочерние процессы использовать измененную среду.

В Unix ключи и значения используют sys.getfilesystemencoding() и обработчик ошибок ‘surrogateescape’ . Если вы хотите использовать другую кодировку, то используйте os.environb .

Заметка:

  • Вызов os.putenv() , напрямую не изменят os.environ , поэтому лучше менять значения ключей os.environ .
  • На некоторых платформах, включая FreeBSD и Mac OS X, настройка os.environ может вызвать утечки памяти.

Если платформа поддерживает функцию os.unsetenv() , то с ее помощью можно удалить элементы в этом отображении os.environ для сброса указанной переменной среды. Функция os.unsetenv() будет вызываться автоматически при удалении элемента из os.environ и при вызове одного из методов .pop() или .clear().

>>> import os >>> os.environ['LANG'] # 'ru_RU.UTF-8' >>> os.environ['HOME'] # '/home/docs-python' >>> os.environ['HOME'] = '/tmp' >>> os.environ.pop('HOME') # '/tmp' >>> os.environ.get('HOME', '/var/www') # '/var/www' # очистка среды окружения os.environ.clear() os.environ # environ(<>) 
os.supports_bytes_environ :

os.supports_bytes_environ производит проверку доступности функций модуля os.environb и os.getenvb() . Эти функции доступны только в том случае, если os.support_bytes_environ равно True . os.support_bytes_environ истинно, если родной тип среды ОС — байты, например False в Windows.

os.environb :

Байт-версия переменных сред окружения: представляет собой объект отображения, подобный словарю который представляет переменные среды окружения в виде байтовых строк. Environment и environmentb синхронизируются, изменяются обновления среды, и наоборот.

Окружение доступно только в том случае, если os.support_bytes_environ равно True .

os.getenv(key, default=None) :

Функция os.getenv() возвращает значение ключа key переменной среды, если оно существует или значение по умолчанию default , если его нет. Значения key , default и возвращаемый результат — строки str .

В Unix ключи и значения декодируются с помощью sys.getfilesystemencoding() и обработчик ошибок ‘surrogateescape’ . Используйте функцию os.getenvb() , если хотите использовать другую кодировку.

Доступность: большинство систем Unix, Windows.

>>> import os >>> os.environ['HOME'] # '/home/docs-python' >>> os.getenv('TEST_ENV', '/tmp') # '/tmp' 
os.getenvb(key, default=None) :

Функция os.getenvb() возвращает значение ключа key переменной среды, если оно существует или значение по умолчанию default , если его нет. Значения key , default и возвращаемый результат — байтовые строки bytes .

Функция os.getenvb() доступна только в том случае, если os.support_bytes_environ равно True.

Доступность: большинство Unix.

os.putenv(key, value) :

Функция os.putenv() устанавливает переменную среды с именем key в строковое значение value . Такие изменения в переменной среде влияют на подпроцессы, запущенные с os.system(), os.popen() или os.fork() и os.execv() .

Примечание. На некоторых платформах, включая FreeBSD и Mac OS X , настройка среды может привести к утечке памяти.

Важно. Если функция os.putenv() поддерживается системой, то изменения для элементов в os.environ автоматически переводятся в соответствующие вызовы os.putenv() , однако самостоятельные вызовы os.putenv() не обновляют значения в словаре os.environ , поэтому предпочтительнее присваивать значения переменных сред элементам os.environ .

Функция os.putenv() вызывает событие аудита os.putenv с аргументами key , value .

Изменено в Python 3.9: Функция теперь всегда доступна.

os.unsetenv(key) :

Функция os.unsetenv() вызывает сброс (удаление) переменной среды окружения с именем key . Такие изменения в переменной среде влияют на подпроцессы, запущенные с os.system(), os.popen() или os.fork() и os.execv() .

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

Функция os.unsetenv() вызывает событие аудита os.unsetenv с аргументом key .

Изменено в Python 3.9: теперь эта функция доступна всегда, а также доступна в Windows.

os.get_exec_path(env=None) :

Функция os.get_exec_path() возвращает список каталогов, в которых будет выполняться поиск исполняемого файла, аналогичного оболочке, например bash , при запуске процесса. Аргумент env , если он указан, должен быть словарем переменных среды для поиска в PATH . По умолчанию, когда env имеет значение None , используется Environment системы.

>>> os.get_exec_path() # ['/home/docs-python/.local/bin', '/usr/local/sbin', # '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', # '/bin', '/usr/games', '/usr/local/games', '/snap/bin'] >>> os.get_exec_path('PATH':'/usr/local/bin:/usr/sbin:/usr/bin:/sbin'>) ['/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin'] 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Управление переменной средой окружения системы
  • Представление пути в файловой системе
  • Извлечение/установка uid, gid и pid процесса
  • Наследование файловых дескрипторов
  • Создание дескриптора файла, чтение, запись и его закрытие
  • Функция listdir() модуля os
  • Функция walk() модуля os
  • Функция scandir() модуля os
  • Объект DirEntry() модуля os
  • Функция stat() модуля os
  • Объект stat_result, результаты выполнения os.stat()
  • Функция lstat() модуля os
  • Функция access() модуля os
  • Функция chdir() модуля os
  • Функция chmod() модуля os
  • Функция chown() модуля os
  • Функция chroot() модуля os
  • Функция getcwd() модуля os
  • Функция link() модуля os
  • Функция mkdir() модуля os
  • Функция makedirs() модуля os
  • Функция symlink() модуля os
  • Функция readlink() модуля os
  • Функция remove() модуля os, удалить файл
  • Функция removedirs() модуля os
  • Функция rename() модуля os
  • Функция renames() модуля os
  • Функция replace() модуля os
  • Функция rmdir() модуля os
  • Функция strerror() модуля os
  • Функция supports_dir_fd модуля os
  • Функция supports_effective_ids модуля os
  • Функция supports_fd модуля os
  • Функция supports_follow_symlinks модуля os
  • Функция truncate() модуля os
  • Функция utime() модуля os
  • Манипулирование списком контроля доступа ACL в Linux
  • Функция abort() модуля os
  • Функция exec*() модуля os
  • Функция popen() модуля os
  • Функция system() модуля os
  • Функция _exit() модуля os
  • Функция fork() модуля os
  • Функция kill() модуля os
  • Функция spawn() модуля os
  • Функция umask() модуля os
  • Функция uname() модуля os
  • Функция wait() модуля os
  • Функция waitpid() модуля os
  • Определение состояния процесса
  • Константы для поддержки операций с путями
  • Генератор случайных байтов на основе модуля os
  • Функция startfile() модуля os
  • Функция times() модуля os
  • Функции getloadavg() и cpu_count() модуля os
  • Функция waitstatus_to_exitcode() модуля os
  • Функция listdrives() модуля os, имена дисков Windows
  • Функция listmounts() модуля os, точки монтирования Windows
  • Функция listvolumes() модуля os, список томов Windows

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

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

В Python для работы с переменными окружения используется модуль os . Он предоставляет функциональность для взаимодействия с операционной системой, включая переменные окружения.

Установка переменных окружения

Для установки значения переменной окружения в Python используется метод os.environ . Это словарь, который содержит текущие переменные окружения. Для установки нового значения достаточно просто присвоить его ключу этого словаря.

import os os.environ["MY_VARIABLE"] = "my value"

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

os.environ["MY_VARIABLE"] = 1 # Неверно!

Для того чтобы присвоить числовое значение, его нужно сначала преобразовать в строку:

os.environ["MY_VARIABLE"] = str(1) # Верно

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

Для чтения значения переменной окружения также используется os.environ . Просто обратитесь к нужному ключу, как если бы это был обычный словарь:

value = os.environ["MY_VARIABLE"]

Если переменная окружения не существует, Python выдаст ошибку. Чтобы избежать этого, можно использовать метод get , который возвращает None , если переменная не найдена:

value = os.environ.get("MY_VARIABLE")

В этом случае, если переменная «MY_VARIABLE» не существует, value будет равно None .

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

Как перебрать глобальные переменные в функции?

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

GLOBAL_VAR_1 = None GLOBAL_VAR_2 = 2 GLOBAL_VAR_3 = 3 def check_vars(): """Функция проверяет доступность переменных окружения.""" required_vars = ['GLOBAL_VAR_1', 'GLOBAL_VAR_2', 'GLOBAL_VAR_3'] for var in required_vars: if var not in globals(): return False global GLOBAL_VAR_1, GLOBAL_VAR_2, GLOBAL_VAR_3 if GLOBAL_VAR_1 is None: return False if GLOBAL_VAR_2 is None: return False if GLOBAL_VAR_3 is None: return False return True if not check_vars(): print('Поломалось') 

Хочется сделать что-то наподобие этого:

GLOBAL_VAR_1 = None GLOBAL_VAR_2 = 2 GLOBAL_VAR_3 = 3 def check_vars(): """Функция проверяет доступность переменных окружения.""" required_vars = ['GLOBAL_VAR_1', 'GLOBAL_VAR_2', 'GLOBAL_VAR_3'] for var in required_vars: try: global var if var != None: continue except: return False return True 

Но не понимаю, как передать в «глобализацию» строку как переменную, а не «глобализировать» ключ цикла

Переменные среды окружения системы (environment)

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

Содержание:

  • Переменная os.environ ,
  • Функция os.supports_bytes_environ ,
  • Переменная os.environb ,
  • Функция os.getenv() ,
  • Функция os.getenvb() ,
  • Функция os.putenv() ,
  • Функция os.unsetenv() ,
  • Функция os.get_exec_path() .
os.environ :

Переменная os.environ это объект сопоставления, подобный словарю, который представляет переменные среды окружения системы. Например, os.environ[‘HOME’] это путь к домашнему каталогу на некоторых платформах и эквивалентен getenv(«HOME») в языке C .

Переменная os.environ фиксируется при первом импорте модуля os , во время запуска Python. Изменения в среде OS, сделанные после этого времени, не отражаются os.environ , за исключением изменений, внесенных путем непосредственного изменения os.environ .

Если платформа поддерживает функцию os.putenv() , то сопоставление os.environ может использовать ее для изменения среды. Функция os.putenv() будет вызываться автоматически при изменении os.environ .

Если платформа не поддерживает функцию os.putenv() , то измененная копия сопоставления os.environ может быть передана соответствующим функциям создания процессов, чтобы заставить дочерние процессы использовать измененную среду.

В Unix ключи и значения используют sys.getfilesystemencoding() и обработчик ошибок ‘surrogateescape’ . Если вы хотите использовать другую кодировку, то используйте os.environb .

Заметка:

  • Вызов os.putenv() , напрямую не изменят os.environ , поэтому лучше менять значения ключей os.environ .
  • На некоторых платформах, включая FreeBSD и Mac OS X, настройка os.environ может вызвать утечки памяти.

Если платформа поддерживает функцию os.unsetenv() , то с ее помощью можно удалить элементы в этом отображении os.environ для сброса указанной переменной среды. Функция os.unsetenv() будет вызываться автоматически при удалении элемента из os.environ и при вызове одного из методов .pop() или .clear().

>>> import os >>> os.environ['LANG'] # 'ru_RU.UTF-8' >>> os.environ['HOME'] # '/home/docs-python' >>> os.environ['HOME'] = '/tmp' >>> os.environ.pop('HOME') # '/tmp' >>> os.environ.get('HOME', '/var/www') # '/var/www' # очистка среды окружения os.environ.clear() os.environ # environ(<>) 
os.supports_bytes_environ :

os.supports_bytes_environ производит проверку доступности функций модуля os.environb и os.getenvb() . Эти функции доступны только в том случае, если os.support_bytes_environ равно True . os.support_bytes_environ истинно, если родной тип среды ОС — байты, например False в Windows.

os.environb :

Байт-версия переменных сред окружения: представляет собой объект отображения, подобный словарю который представляет переменные среды окружения в виде байтовых строк. Environment и environmentb синхронизируются, изменяются обновления среды, и наоборот.

Окружение доступно только в том случае, если os.support_bytes_environ равно True .

os.getenv(key, default=None) :

Функция os.getenv() возвращает значение ключа key переменной среды, если оно существует или значение по умолчанию default , если его нет. Значения key , default и возвращаемый результат — строки str .

В Unix ключи и значения декодируются с помощью sys.getfilesystemencoding() и обработчик ошибок ‘surrogateescape’ . Используйте функцию os.getenvb() , если хотите использовать другую кодировку.

Доступность: большинство систем Unix, Windows.

>>> import os >>> os.environ['HOME'] # '/home/docs-python' >>> os.getenv('TEST_ENV', '/tmp') # '/tmp' 
os.getenvb(key, default=None) :

Функция os.getenvb() возвращает значение ключа key переменной среды, если оно существует или значение по умолчанию default , если его нет. Значения key , default и возвращаемый результат — байтовые строки bytes .

Функция os.getenvb() доступна только в том случае, если os.support_bytes_environ равно True.

Доступность: большинство Unix.

os.putenv(key, value) :

Функция os.putenv() устанавливает переменную среды с именем key в строковое значение value . Такие изменения в переменной среде влияют на подпроцессы, запущенные с os.system(), os.popen() или os.fork() и os.execv() .

Примечание. На некоторых платформах, включая FreeBSD и Mac OS X , настройка среды может привести к утечке памяти.

Важно. Если функция os.putenv() поддерживается системой, то изменения для элементов в os.environ автоматически переводятся в соответствующие вызовы os.putenv() , однако самостоятельные вызовы os.putenv() не обновляют значения в словаре os.environ , поэтому предпочтительнее присваивать значения переменных сред элементам os.environ .

Функция os.putenv() вызывает событие аудита os.putenv с аргументами key , value .

Изменено в Python 3.9: Функция теперь всегда доступна.

os.unsetenv(key) :

Функция os.unsetenv() вызывает сброс (удаление) переменной среды окружения с именем key . Такие изменения в переменной среде влияют на подпроцессы, запущенные с os.system(), os.popen() или os.fork() и os.execv() .

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

Функция os.unsetenv() вызывает событие аудита os.unsetenv с аргументом key .

Изменено в Python 3.9: теперь эта функция доступна всегда, а также доступна в Windows.

os.get_exec_path(env=None) :

Функция os.get_exec_path() возвращает список каталогов, в которых будет выполняться поиск исполняемого файла, аналогичного оболочке, например bash , при запуске процесса. Аргумент env , если он указан, должен быть словарем переменных среды для поиска в PATH . По умолчанию, когда env имеет значение None , используется Environment системы.

>>> os.get_exec_path() # ['/home/docs-python/.local/bin', '/usr/local/sbin', # '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', # '/bin', '/usr/games', '/usr/local/games', '/snap/bin'] >>> os.get_exec_path('PATH':'/usr/local/bin:/usr/sbin:/usr/bin:/sbin'>) ['/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin'] 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Управление переменной средой окружения системы
  • Представление пути в файловой системе
  • Извлечение/установка uid, gid и pid процесса
  • Наследование файловых дескрипторов
  • Создание дескриптора файла, чтение, запись и его закрытие
  • Функция listdir() модуля os
  • Функция walk() модуля os
  • Функция scandir() модуля os
  • Объект DirEntry() модуля os
  • Функция stat() модуля os
  • Объект stat_result, результаты выполнения os.stat()
  • Функция lstat() модуля os
  • Функция access() модуля os
  • Функция chdir() модуля os
  • Функция chmod() модуля os
  • Функция chown() модуля os
  • Функция chroot() модуля os
  • Функция getcwd() модуля os
  • Функция link() модуля os
  • Функция mkdir() модуля os
  • Функция makedirs() модуля os
  • Функция symlink() модуля os
  • Функция readlink() модуля os
  • Функция remove() модуля os, удалить файл
  • Функция removedirs() модуля os
  • Функция rename() модуля os
  • Функция renames() модуля os
  • Функция replace() модуля os
  • Функция rmdir() модуля os
  • Функция strerror() модуля os
  • Функция supports_dir_fd модуля os
  • Функция supports_effective_ids модуля os
  • Функция supports_fd модуля os
  • Функция supports_follow_symlinks модуля os
  • Функция truncate() модуля os
  • Функция utime() модуля os
  • Манипулирование списком контроля доступа ACL в Linux
  • Функция abort() модуля os
  • Функция exec*() модуля os
  • Функция popen() модуля os
  • Функция system() модуля os
  • Функция _exit() модуля os
  • Функция fork() модуля os
  • Функция kill() модуля os
  • Функция spawn() модуля os
  • Функция umask() модуля os
  • Функция uname() модуля os
  • Функция wait() модуля os
  • Функция waitpid() модуля os
  • Определение состояния процесса
  • Константы для поддержки операций с путями
  • Генератор случайных байтов на основе модуля os
  • Функция startfile() модуля os
  • Функция times() модуля os
  • Функции getloadavg() и cpu_count() модуля os
  • Функция waitstatus_to_exitcode() модуля os
  • Функция listdrives() модуля os, имена дисков Windows
  • Функция listmounts() модуля os, точки монтирования Windows
  • Функция listvolumes() модуля os, список томов Windows

Как перебрать глобальные переменные в функции?

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

GLOBAL_VAR_1 = None GLOBAL_VAR_2 = 2 GLOBAL_VAR_3 = 3 def check_vars(): """Функция проверяет доступность переменных окружения.""" required_vars = ['GLOBAL_VAR_1', 'GLOBAL_VAR_2', 'GLOBAL_VAR_3'] for var in required_vars: if var not in globals(): return False global GLOBAL_VAR_1, GLOBAL_VAR_2, GLOBAL_VAR_3 if GLOBAL_VAR_1 is None: return False if GLOBAL_VAR_2 is None: return False if GLOBAL_VAR_3 is None: return False return True if not check_vars(): print('Поломалось') 

Хочется сделать что-то наподобие этого:

GLOBAL_VAR_1 = None GLOBAL_VAR_2 = 2 GLOBAL_VAR_3 = 3 def check_vars(): """Функция проверяет доступность переменных окружения.""" required_vars = ['GLOBAL_VAR_1', 'GLOBAL_VAR_2', 'GLOBAL_VAR_3'] for var in required_vars: try: global var if var != None: continue except: return False return True 

Но не понимаю, как передать в «глобализацию» строку как переменную, а не «глобализировать» ключ цикла

Переменные окружения — Основы командной строки

Команда cd без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?

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

Эта команда ориентируется на так называемую переменную окружения, которую мы изучим в этом уроке.

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

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

Посмотреть установленные переменные можно командой env (environment). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:

env TERM=xterm-256color SHELL=/bin/bash LC_ALL=en_US.UTF-8 USER=kirill.m HEXLET_VERSION=v2711 PATH=/home/kirill.m/bin:/home/kirill.m/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin PWD=/home/kirill.m LANG=en_US.UTF-8 SHLVL=1 HOME=/home/kirill.m LOGNAME=kirill.m 

Формат вывода очень простой: слева от знака равно расположено имя переменной, справа — значение. В вашем случае вывод команды env будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION , но наверняка будет HOME , только с другим значением.

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

Возьмем для примера ту же команду cd . Она знает лишь то, что домашняя директория доступна в переменной окружения HOME . Как она попала в систему — не важно.

Без переменной окружения пришлось бы делать одну из двух вещей:

  • При вызове cd каждый раз указывать, где находится домашняя директория. Например, так: cd —home-dir /home/kirill.m . Такой способ убивает весь смысл быстрого перехода в домашнюю директорию
  • Договариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой cd при каждом запуске

Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это HOME :

# Для вывода переменной используется echo, # а перед самой переменной ставится знак $ echo $HOME /home/kirill.m # Вокруг знака `=` не должно быть пробелов HOME=/tmp echo $HOME /tmp # Возвращаем обратно HOME=/home/kirill.m echo $HOME /home/kirill.m 

Теперь проведем эксперимент: попробуем установить HOME и выполнить переход в эту директорию с помощью команды cd , которая должна отправить нас в домашнюю директорию:

# Достаточно выполнить присваивание слева от запускаемой команды HOME=/tmp cd /tmp pwd /tmp 

Команда cd выполнила переход по пути, указанном в переменной HOME . Теперь снова сделаем cd , но не добавляя определение переменной слева:

cd pwd /home/kirill.m echo $HOME /home/kirill.m 

В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный.

Когда мы указали HOME=/tmp прямо перед командой cd , то переменная не была изменена для текущей сессии — она была изменена для запущенной команды, в данном случае cd . Такой трюк можно проделывать с любой командой.

Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:

echo $HOME /home/kirill.m export HOME=/tmp cd pwd /tmp echo $HOME /tmp 

Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.

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

Самостоятельная работа

Изучите переменные окружения в вашей локальной среде, набрав команду env .

Дополнительные материалы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

  • Статья «Как учиться и справляться с негативными мыслями»
  • Статья «Ловушки обучения»
  • Статья «Сложные простые задачи по программированию»
  • Вебинар « Как самостоятельно учиться »

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Переменные окружения для Python проектов

При разработки web-приложения или бота мы часто имеем дело с какой-либо секретной информацией, различными токенами и паролями (API-ключами, секретами веб-форм). «Хардкодить» эту информацию, а тем более сохранять в публично доступной системе контроля версий это очень плохая идея.

# Плохая практика. Не делай так. API_KEY = 'very_secret_password'
Конфигурационные файлы

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

# Уже лучше. from config import API_KEY app = Flask(__name__) app.config['API_KEY'] = API_KEY
Переменные окружения

Более продвинутый подход, это использование переменных окружения. Переменные окружения это именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Например, чтобы запустить flask-приложение, вначале нужно указать в переменной окружения FLASK_APP имя нашего приложения:

$ export FLASK_APP=hello.py $ flask run * Running on http://127.0.0.1:5000/

С помощью переменных окружения можно получать различные параметры приложение и секретные ключи:

import os app.config['API_KEY'] = os.environ.get('API_KEY')
Библиотека python-dotenv

Чтобы не задавать каждый раз вручную переменные окружения при новом запуске терминала, можно воспользоваться пакетом python-dotenv. Он позволяет загружать переменные окружения из файла .env в корневом каталоге приложения.
Устанавливаем пакет:

pip install python-dotenv

Теперь можно создать файл .env со всеми переменными среды, которые необходимы вашему приложению. Важно, добавьте .env -файл в .gitignore , не храните его в системе контроля версий.

import os from dotenv import load_dotenv dotenv_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(dotenv_path): load_dotenv(dotenv_path)

Этот .env-файл можно использовать для всех переменных конфигурации, но его нельзя использовать для переменных среды FLASK_APP и FLASK_DEBUG , так как они необходимы уже в процессе начальной загрузки приложения.

Утилита direnv

Переменные среды могут быть автоматически загружены при входе в папку с проектом, это особенно удобно при работе с несколькими проектами одновременно. Сделать это позволяет утилита direnv. Direnv — это менеджер переменных среды для терминала, поддерживает bash, zsh, tcsh и др. оболочки. Позволяет автоматически загружать и выгружать переменные среды в зависимости от вашего текущего каталога. Это позволяет иметь переменные среды, специфичные для каждого проекта. Перед каждым приглашением проверяется наличие файла .envrc в текущем и родительском каталогах. Если файл существует, он загружается в подшаблон bash, и все экспортированные переменные затем захватываются direnv, а затем становятся доступными для оболочки.

sudo apt-get install direnv

Далее необходимо в нести изменения для настройки нашей оболочки, для bash необходимо в конец файла ~/.bashrc добавить следующее и перезапустить консоль:

eval "$(direnv hook bash)"

Пример использования direnv

Создадим новую папку для проекта:
$ mkdir ~/my-project $ cd ~/my-project
Покажем, что переменная окружения FLASK_APP не загружена:
$ echo $FLASK_APP nope
Запишем переменные окружения в файл .envrc :
$ echo export FLASK_APP=hello.py > .envrc .envrc is not allowed
Для обеспечения безопасности, после создания или изменения файла .envrc , нужно выполнить подтверждение с помощью команды direnv allow:
$ direnv allow . direnv: reloading direnv: loading .envrc direnv export: +FLASK_APP
Покажем, что переменная окружения загружена:
$ echo $FLASK_APP hello.py
При выхода из папки с проектом переменные окружения выгружаются
$ cd .. direnv: unloading
и становятся снова не заданными
$ echo $FLASK_APP nope
Работа с виртуальным окружением в direnv

Кроме загрузки переменных окружения, утилита direnv позволяет также работать с виртуальным окружением для Python.
Виртуальное окружение позволяет использовать для отдельные проектов разные версии интерпретатора python и пакетов библиотек. Существует несколько способов создания виртуального окружения для python, здесь мы рассмотрим модуль venv, для другие варианты описаны в документации к direnv.

Чтобы использовать venv для автоматического создания и активирования виртуального окружения, необходимо добавить в файл ~/.config/direnv/direnvrc следующий код (см. документацию).

Создание виртуального окружения

Если в файл .envrc добавить строчку

layout python-venv

то при переходе в папку будет direnv создаст виртуальное окружение в папке direnv, например .direnv/python-venv-3.7.3 .
Чтобы создать виртуальное окружение с другим путем, например в более привычной папке venv, надо задать переменную VIRTUAL_ENV :

export VIRTUAL_ENV=.venv

Таким же способом можно подключать уже созданное виртуальное окружение.

Работа с разными версиями Python

Для установки отличной от системной версии python, нужно использовать команду:

layout python-venv python3.6
Создаем строку приглашения bash (PS1)

В отличие от ручной активации виртуального окружения, в нашем случае строка приглашения bash (PS1) не будет изменена (обычно она выглядит как (venv) user@comp:~$ ). Чтобы вернуть показ активации виртуального окружения в консоли нужно в файл ~/.bashrc добавить следующий код:

show_virtual_env() < if [[ -n "$VIRTUAL_ENV" && -n "$DIRENV_DIR" ]]; then echo "($(basename $VIRTUAL_ENV))" fi >export -f show_virtual_env PS1='$(show_virtual_env)'$PS1
Пример файла настройки файла .envrc

Вот так может выглядеть файл .envrc настроенный для разработки flask-приложения:

export VIRTUAL_ENV=venv layout python-venv export FLASK_APP=app.py export FLASK_DEBUG=1

Это позволяет автоматически активировать виртуальное окружение и загрузить переменные окружения при входе в папку с проектом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *