Наследование переменных env в python

#python #python-3.x #bash

#python #python-3.x #bash

Вопрос:

Мне нужно получить переменную env $PS1 родительского процесса (оболочки), который вызывает программу на python. $PS1 не принадлежит os.environ процессу внутри python и sys.ps1 хранит свое собственное приглашение.

Как мы можем передать эту переменную программе из оболочки?

Я вызываю программу с помощью : python3 program.py из командной строки.

Комментарии:

1. Только интерактивная оболочка знает значение $PS1 . Покажите нам, как вы вызываете скрипт python из оболочки

2. Хорошо, я отредактировал свой ответ, оболочка, из которой я вызываю программу python, знает $PS1

3. Вы пробовали python3 -i program.py ?

4. У меня нет доступа к $PS1 оболочке. Если мое приглашение в командной строке prompt$ и я вызываю python3 program.py , я хочу получить $PS1 = prompt$ внутри программы на python

Ответ №1:

Скрипт python может обращаться ко всем переменным среды через os.environ . Ваша проблема в том, что PS1 это не переменная окружения, а всего лишь локальная переменная оболочки.

Это означает, что оболочка не передает это своему дочернему элементу в среде (вы можете управлять этим, набрав env или printenv в вашей оболочке). Таким образом, если вы вручную не поместите это в среду перед запуском Python ( export PS1 для sh или bash), вы не сможете получить это в своем скрипте Python.

Комментарии:

1. локальная переменная оболочки, согласовано. Но не все запущенные оболочки будут иметь видимость PS1 , только интерактивные

2. @Inian: моя оболочка Posix во FreeBSD имеет локальный PS1, независимо от того, запущен он интерактивно или нет. Но ни один из его дочерних элементов не может этого знать.

3. Я знаю, что вы можете использовать env MYVAR=value child_cmd для передачи локальной переменной дочернему элементу, но как printenv передать локальную переменную дочернему элементу?

Ответ №2:

Если значение, присвоенное $PS1 , не изменяется во время выполнения вашего program.py , то, вероятно, лучшим вариантом является передача его в качестве аргумента и извлечение его в вашем скрипте с помощью argparse. Если значение меняется во время выполнения, то одним из вариантов было бы сохранить его в каком-нибудь временном файле и прочитать оттуда.