#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. Если значение меняется во время выполнения, то одним из вариантов было бы сохранить его в каком-нибудь временном файле и прочитать оттуда.