python 3 Popen (полу-) интерактивное взаимодействие с процессом, Popen.communicate () против Popen.stdin / Popen.stdout - PullRequest
0 голосов
/ 21 ноября 2018

Все примеры, которые я вижу для взаимодействия с процессом, использующим Python 3 subprocess.Popen, используют Popen.communicate("input_text") ровно один раз перед вызовом Popen.communicate(), чтобы получить стандартный вывод и завершить программу.У меня есть несколько программ, которые я хочу написать в сценарии, которые требуют вмешательства человека через stdin, поэтому я хочу автоматизировать их, так как запросы предсказуемы.

Например, внутреннее приложение лицензирования требует, чтобы мы пропустили приложениеинформация через запросы (не из командной строки), относящиеся к уникальному идентификатору клиента (4-значное целое число), количеству пользователей и т. д. И затем это должно быть сделано 30 раз (случайное число), каждое для отдельного продукта,идентифицируется другим целым числом.

Сценарии, которые просты, если только я смогу научиться делать устойчивые взад-вперед, используя Popen.Должен ли я использовать Popen.communicate() или Popen.stdout и Popen.stdin() и в чем разница между ними?

1 Ответ

0 голосов
/ 18 декабря 2018

Popen.communicate будет блокироваться до тех пор, пока подпроцесс не завершится или не завершится неудачей, и только после этого вернет информацию из stdout и stderr.Так что это не то, что вам нужно.

stdin, stdout & stderr - это, по сути, специальные файлы, принадлежащие процессу, которые вы можете читать или записывать, так же, как и любой другой файл, но ониможет предоставить интерфейс между процессами, если вы передадите в них информацию.

Недавно мне пришлось реализовать нечто похожее на то, что вы описали, единственный способ, которым я смог получить информацию через стандартный вывод процесса "клиента", былс помощью модуля pty.Я свяжу вам два ответа, которые мне помогли, однако учтите, что эти решения предназначены только для Posix и использование shell=True представляет угрозу безопасности.https://stackoverflow.com/a/5413588/533362 & https://stackoverflow.com/a/13605804/3565382.

...