我试图弄清楚如何控制交互式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
永远不会陷入循环)