получить приглашение оболочки в python

Я хочу получить приглашение оболочки (zsh) в скрипте python. Просто используя

import os prompt = os.environ['PS1'] 

кажется, не является правильным способом, поскольку PS1 обычно не перенаправляется на подпроцессы. Таким же образом env | grep PS env | grep PS в оболочке не работает.

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

 zsh -c -i 'echo $PS1' 

(должны быть одинарные кавычки, сдвоенные кавычки)

Я попытался сделать то же самое с python (2.7) с subprocess следующим образом:

 print subprocess.check_output(['-i','-c',r"'echo $PS1'"],executable="/bin/zsh") 

Это не с

 subprocess.CalledProcessError: Command '['-i', '-c', "'echo $PS1'"]' returned non-zero exit status 127 

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

Пытаясь взад и вперед, различные комбинации, в которые я попал

 prompt = subprocess.check_output("""zsh -c -i 'echo $PS1'""",shell=True,executable="/bin/zsh") 

который, похоже, выполняет эту работу, но кажется мне неправильным, поскольку это запускает оболочку и в этой оболочке вызывает еще одну оболочку с -c -i 'echo $PS1' .

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

  • Тестирование LS_COLORS в zsh
  • Выполнение скрипта в .zshrc
  • zsh завершение: меню и однозначный префикс с одной вкладкой?
  • Восстановление опции в конце функции в zsh
  • Передача команды с аргументами скрипту
  • Распределение порядка стека каталога в zsh
  • Как заставить команды выделяться жирным шрифтом в zsh?
  • Как сортировать имена файлов в числовом порядке и измененный порядок времени?
  • 2 Solutions collect form web for “получить приглашение оболочки в python”

     print subprocess.check_output(['zsh','-i','-c','echo $PS1']) 

    При запуске zsh из другой оболочки кавычки вокруг echo $PS1 необходимы, чтобы вся строка передавалась как единственный аргумент после -c . Они должны были быть одинарными кавычками, потому что в двойных кавычках первая оболочка расширила бы $PS1 .

    В Python вся команда представляет собой одну строку, поэтому она цитируется как любая другая строка. Добавление второго набора похоже на ввод 'echo $PS1' (с кавычками) в zsh – оболочка ищет и не находит исполняемый файл с именем 'echo $PS1' .

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

     >>> prompt = subprocess.check_output("""echo $PS1""",shell=True,executable="/bin/zsh") 

    Затем вы можете проверить результат на >>> prompt Enter или вы можете использовать вызов, чтобы увидеть результаты напрямую:

     >>> subprocess.call("""echo $PS1""",shell=True,executable="/bin/zsh") 

    Поэтому вам не нужно вызывать zsh в самой команде.

    Для интерактивного взаимодействия можно использовать Popen :

     >>> Popen(["/bin/zsh"], stdout=PIPE).communicate()[0] SHELL_PROMPT% echo $PS1 SHELL_PROMPT% exit # exit to see the result of command 

    Для получения дополнительной информации см. Подпроцесс

    Также обратите внимание на предупреждение об использовании shell=True из приведенной выше ссылки:

    Предупреждение. Выполнение команд оболочки, включающих несанкционированный ввод из ненадежного источника, делает программу уязвимой для инъекции оболочки, серьезный недостаток безопасности, который может привести к произвольному выполнению команды. По этой причине использование shell = True сильно обескуражено в случаях, когда командная строка построена из внешнего ввода:

     >>> from subprocess import call >>> filename = input("What file would you like to display?\n") What file would you like to display? non_existent; rm -rf / # >>> call("cat " + filename, shell=True) # Uh-oh. This will end badly... shell=False does not suffer from this vulnerability; the above Note may be helpful in getting code using shell=False to work. 
    Linux и Unix - лучшая ОС в мире.