Я пытаюсь выяснить, как управлять интерактивным вводом / выводом.
Самый простой сценарий выглядит так: Какой-то скрипт черного ящика непрерывно читает строку и пишет строку.
Затем можно легко сопоставить ввод и соответствующий вывод.
blackbox.py:
for i in range(5):
a = input()
print(f'line {i}: {a}')
main.py:
proc = subprocess.Popen(['python3', 'blackbox.py'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
for text in ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']:
in_str = bytes(f'{text}\n')
proc.stdin.write(in_str, 'utf-8'))
proc.stdin.flush()
out_str = proc.stdout.readline()
# now I get (in_str, out_str) pair
proc.stdin.close()
proc.terminate()
Но что, если blackbox.py
похож на это ?: blackbox.py:
for i in range(5):
a = input()
if some_function(a):
print(f'line {i}: {a}')
elif still_some_function(a):
print(f'foofoo1 {i}: {a}')
print(f'foofoo1 {i}: {a}')
else:
print(f'barbar1 {i}: {a}')
print(f'barbar2 {i}: {a}')
print(f'barbar3 {i}: {a}')
main.py:
# ...
for text in ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']:
in_str = bytes(f'{text}\n')
proc.stdin.write(in_str, 'utf-8'))
proc.stdin.flush()
# output_str = read_all()
# how can I get (in_str, out_str) pair
# ...
Я хочу, чтобы read_all()
прочитал вывод изproc
, который записан между a = input()
и следующим a = input()
.
Конечно stdout.read()
не будет работать, так как он будет ждать до EOF вечно.read_all()
ожидает EOF
или какого-либо специального сигнала (если таковой существует), что подпроцесс снова ожидает другого входа.
Как следует из названия, blackbox.py
заранее неизвестно.(Предположим, blackbox.py
никогда не застрянет на петле)