Правильный способ использования переменных среды (передаваемых из оболочки / терминала) в коде Python - PullRequest
0 голосов
/ 14 июня 2019

У меня есть скрипт оболочки bash (работающий в Ubuntu 18.04), который читает некоторые входные данные (файл или пользователь) и присваивает нескольким переменным (окружения) различные значения в зависимости от ввода.Сценарий запускает программу (python), которой затем в разных точках выполнения требуются значения, которые были назначены переменным среды.

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

# shell script
[...]
export VAR_A = value1
export VAR_B = value2
python program.py
[...]

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

# class1.py, used by program.py
import helper
[...]
var_a = helper.get_var_a()
var_b = helper.get_var_b()
[...]

Вспомогательный класс используется для фактического чтения переменных среды.

# helper.py
[...]
import os
def get_var_a():
    return os.environ["VAR_A"]

Код делает то, что делает правильно.Это, однако, не выглядит «хорошо», и я сомневаюсь, что это следует за любой передовой практикой.То, что я хотел бы, или ищу, - это метод, который либо читает переменные окружения один раз и сохраняет их в переменной программы.Что-то вроде следующего:

# helper.py
# [...]
import os
ENVIRONMENT = { "VAR_A" : os.environ["VAR_A"], "VAR_B" : os.environ["VAR_B"] }
[...]

И чтобы получить это:

# class1.py
var_a = helper.ENVIRONMENT["VAR_A"]

Вопрос: Это (фрагмент выше) лучше илихудший подход по очереди:

  • Удобочитаемость / ремонтопригодность
  • Выполнение кода / эффективность
  • Любая другая более оптимальная или "питоническая" альтернатива?

Ответы [ 2 ]

1 голос
/ 14 июня 2019

" считывает переменные среды один раз и сохраняет их в переменной программы " - это уже сделано.

Переменные среды хранятся в блоке среды процесса. В python они копируются в словарь os.environ один раз, когда инициализируется модуль os. Способ доступа к блоку среды не является переносимым, и Python защищает нас от этого.

Существует специальный код Python для добавления и удаления переменных среды и обновления блока среды при обновлении словаря.

Так что нет смысла делать еще одну его копию.

Удобочитаемость / ремонтопригодность - использование другого имени переменной может привести к путанице. Хуже того, если вы скопировали переменные окружения в начале своего кода, а затем изменили их, копия и os.environ будут не в порядке. Любые новые значения не будут находиться в блоке среды и не будут распространяться на дочерние процессы.

Выполнение кода / эффективность - хранение двух копий одних и тех же данных всегда менее эффективно. Будет ли это значительными накладными расходами, будет зависеть от размера os.environ.

Любая другая более оптимальная или "питоническая" альтернатива? Да, используйте os.environ.

1 голос
/ 14 июня 2019

helper.py:

import os
ENVIRONMENT = os.environ

test.py =

import helper
print(helper.ENVIRONMENT["hello"])

Тестирование:

export hello="world"; python test.py

Печать:

world

... В основном вы пытаетесь создать объект, который уже реализован: os.environ

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