Как добиться интерактивного подпроцесса ввода-вывода - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь выяснить, как управлять интерактивным вводом / выводом.

Самый простой сценарий выглядит так: Какой-то скрипт черного ящика непрерывно читает строку и пишет строку.

Затем можно легко сопоставить ввод и соответствующий вывод.

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 никогда не застрянет на петле)

...