выполнить shell-скрипт из подпроцесса Python

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

Я могу'найти способ сделать это, используяsubprocess! (с помощьюpexpect кажется немного чрезмерным, так как мне нужно только запустить его и отправить пару ДА)

Пожалуйста, не'Не предлагайте способы, которые требуют модификации в shell-скрипте!

 Rahul Gautam31 мая 2013 г., 13:02
Если это возможно, то вам следует создать еще один сценарий оболочки (2), который отвечает за ваш сценарий (1), используя eof или read. затем выполните скрипт с помощью python subprocess.popen,
 Elazar31 мая 2013 г., 13:10
os.system('yes | sed s/y/yes/ | ./myshell.sh')

Ответы на вопрос(1)

Решение Вопроса

С использованиемsubprocess библиотека, вы можете сказатьPopen класс, которым вы хотите управлять стандартным вводом процесса следующим образом:

import subprocess
shellscript = subprocess.Popen(["shellscript.sh"], stdin=subprocess.PIPE)

Сейчасshellscript.stdin это файловый объект, для которого вы можете вызвать:write

shellscript.stdin.write("yes\n")
shellscript.stdin.close()
returncode = shellscript.wait()   # blocks until shellscript is done

Вы также можете получить стандартную и стандартную ошибку из процесса, установивstdout=subprocess.PIPE а такжеstderr=subprocess.PIPEно ты не должент использоватьPIPEs как для стандартного ввода, так и для стандартного вывода, так как это может привести к тупику. (См.документация.) Если вам нужно подключиться к трубе, используйтеcommunicate метод вместо файловоподобных объектов:

shellscript = subprocess.Popen(["shellscript.sh"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = shellscript.communicate("yes\n")   # blocks until shellscript is done
returncode = shellscript.returncode
 Jim Pivarski01 июн. 2013 г., 03:15
Ах, верно --- этоЧто я имел в виду, но яОтредактирую ответ, чтобы быть более явным. (Или, может быть, вы уже сделали? Во всяком случае, теперь смотрит прямо на меня.)
 jfs01 июн. 2013 г., 03:19
Кроме того, вы могли быfrom subprocess import Popen, PIPE избежатьsubprocess. префикс для читабельности
 jfs01 июн. 2013 г., 03:13
stdout, stderr должен быть установлен во втором вызове Popen, иначе.communicate() возвращаетсяNones (без перенаправления)

Ваш ответ на вопрос