2016-06-10 7 views
1

В Python, я могу получить доступ к переменной среды как:Определите, как была установлена ​​переменная окружения

os.environ['FOO'] 

Я хотел бы знать, если переменная была установлена ​​ранее с помощью export или, если он был установлен только для текущего сценария питона как так:

FOO=BAR python some-script.py 

в основном я хочу использовать только FOO, если он был установлен, как в строке выше и не постоянно определяется в export.

Аргументы к самому скрипту python, к сожалению, здесь отсутствуют. Это плагин, и родительское приложение не позволяет передавать пользовательские аргументы, которые он сам не понимает.

Я надеялся, что каким-то образом я смог получить доступ к точной и полной команде (FOO=BAR python some-script.py), которая запустила python, но похоже, что ничего подобного нет. Я думаю, если бы существовала такая функция, это было бы где-то в пакетах os или sys.

+4

Как оболочка определяет, что env для передачи исполняемой программе не является чем-то, о чем должна заботиться программа, поэтому часть FOO = BAR обрабатывается только оболочкой, она не подвергается каким-либо образом, поэтому вы пытаетесь сделать невозможно. – mata

+2

Это так же плохо, как и функции, которые ведут себя по-разному в зависимости от того, как они были вызваны. Это ужасная идея. Почему вы вынуждаете абонента использовать определенные соглашения, что на самом деле может быть чрезвычайно громоздким? Возможность «экспортировать FOO = BAR», а затем * не * необходимость повторного прохождения аргумента - это инструмент удобства; почему запрещают пользователям использовать его? – deceze

+1

Поскольку, как описано, использование окружения vars просто является обходным путем для того, чтобы не было возможности передавать пользовательские аргументы. Тем не менее это аргумент и должен вести себя как один. По умолчанию, что было определено на прошлой неделе, нет опции. Мы говорим здесь об управлении удаленными системами, а какая система изнашивается и переустанавливается, я ничего не хочу отбирать из среды только из-за ошибки пользователя. – udondan

ответ

4

Окружающая среда - это просто массив строк C, там нет метаинформации, которая поможет вам узнать, имеет ли вызывающая оболочка переменная, помеченная как export, или нет.

В Linux вы можете изучить /proc/(pid)/environ родительского PID (если у вас есть соответствующие разрешения), чтобы узнать, что находится в постоянной среде родителя, но это явно непереносимо и хрупко.

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

Смежные вопросы