Как я могу получить переменные среды, определенные при запуске скрипта в python?

Контекст

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

Назовем «Предопределенные переменные» те переменные, которые уже есть в среде на момент запуска скрипта.

«Переменные времени запуска» — это те, которые определены встроенными при вызове скрипта и применяются только к среде процесса, созданного при запуске скрипта.

Вот некоторые примеры:

  • Предопределенные переменные:
export var1 = "value1"
export var2 = "value2"
# ... more commands
# Now var1 and var3 are in the python process' environment
python script.py args
  • Переменные, определяемые запуском:
var1 = "value1" var2 = "value2" python script.py args

Моя проблема

Я могу использовать os.environ для доступа к переменным из моего скрипта Python.

Однако я хотел бы различать «предопределенные» переменные и переменные «времени запуска» внутри моего кода Python.

Мой вариант использования следующий. Предположим, я запускаю такой скрипт:

var1 = "value1" var2 = "value2" python script.py args

Я хотел бы иметь возможность регистрировать всю команду, введенную в командной строке, то есть:

  • имя сценария
  • аргументы сценария
  • переменные среды, определенные перед командой (var1 и var2)

Первые два пункта можно сделать с помощью sys.argv, но на данный момент я не могу отличить ранее определенные переменные от var1 и var2.


Редактировать

Добавлен некоторый контекст, чтобы прояснить мои намерения.

Я не уверен, но мое чутье подсказывает, что это невозможно. Среда — это всего лишь один блок пар ключ-значение; ваша программа просто получает все это и не знает, откуда оно взялось или как оно было построено.

BrenBarn 23.12.2022 10:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

вы можете получить исходные переменные среды

for k,v in os.environ.items():
  print(f"{k} = {v}")

а затем вы можете установить свой:

os.envrion["var1"]=value1
os.envrion["var2"]=value2

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

IvanProsperi94 23.12.2022 11:43

@IvanProsperi94: Затем вы можете добавить параметры командной строки в свой скрипт, чтобы переопределить настройки среды.

BrenBarn 23.12.2022 21:15

К сожалению, это не вариант, собственно поэтому и возникает проблема, так как я не использую параметры командной строки. Конфигурация обрабатывается Pydantic и анализируется из файла JSON, а переменные среды — это способ переопределения конфигураций из JSON. Еще раз спасибо за ваши комментарии.

IvanProsperi94 27.12.2022 16:50
Ответ принят как подходящий

Не совсем понятно, что вы пытаетесь отличить. Я думаю, это ваши случаи:

export var1 = "value1"
python script.py args
### vs
var1 = "value1" python script.py args

Если я прав, то это невозможно сделать из Python (да и вообще из любого языка). Это функция оболочки для установки/переопределения переменной среды при выполнении команды, поэтому процесс получает полную среду в виде словаря (или хэш-карты, если хотите), и нет никакой разницы между переменными среды в зависимости от того, как они были установлены. .

Другие вопросы по теме