如何实现交互式子流程I / O

时间:2018-11-24 08:29:04

标签: python process blocking

我试图弄清楚如何控制交互式I / O。

最简单的情况是: 某些黑盒脚本连续读取一行,并写入一行

然后,很容易映射输入和对应的输出。

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永远不会陷入循环)

0 个答案:

没有答案