Подпроцесс Python и взаимодействие с пользователем - программирование
Подтвердить что ты не робот

Подпроцесс Python и взаимодействие с пользователем

Я работаю над интерфейсом GUI в Python 2.6, и обычно он довольно прост: вы используете subprocess.call() или subprocess.Popen() для выдачи команды и ждете, пока она завершится или отреагирует на ошибку. Что вы делаете, если у вас есть программа, которая останавливается и ожидает взаимодействия с пользователем? Например, программа может остановиться и запросить у пользователя идентификатор и пароль или как обработать ошибку?

c:\> parrot
Military Macaw - OK
Sun Conure - OK
African Grey - OK
Norwegian Blue - Customer complaint!
(r) he Resting, (h) [Hit cage] he moved, (p) he Pining for the fjords

Пока все, что я прочитал, говорит о том, как читать все выходные данные программы только после ее завершения, а не о том, как обрабатывать выходные данные, пока программа еще работает. Я не могу установить новые модули (это для LiveCD), и я буду иметь дело с пользовательским вводом более одного раза.

4b9b3361

Ответ 1

Ознакомьтесь с руководством подпроцесса. У вас есть опции с subprocess, чтобы иметь возможность перенаправить stdin, stdout и stderr процесса, который вы вызываете, к своему собственному.

from subprocess import Popen, PIPE, STDOUT

p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

grep_stdout = p.communicate(input='one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print grep_stdout

Вы также можете построчно взаимодействовать с процессом. Учитывая это как prog.py:

import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()

Вы можете взаимодействовать с ним построчно с помощью:

>>> from subprocess import Popen, PIPE, STDOUT
>>> p = Popen(['python', 'prog.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> p.stdout.readline().rstrip()
'what is your name'
>>> p.communicate('mike')[0].rstrip()
'your name is mike'

ОБНОВЛЕНИЕ: В python3 это должно быть 'mike'.encode().