与交互式程序通信时进程挂起
Process hangs when communicating with an interactive program
我创建了一个简单的 echo.py
像这样:
import sys
while True:
s = sys.stdin.readline()
s = s.strip('\n')
if s == 'exit':
break
sys.stdout.write("You typed: %s\n" % s)
它在终端上运行良好。
另一个与 echo.py
交互的程序名为 main.py
import subprocess
if __name__ == '__main__':
proc = subprocess.Popen(['python', 'echo.py'],stdin=subprocess.PIPE,
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
proc.stdin.write(b'Hello\n')
proc.stdin.flush()
print(proc.stdout.readline())
proc.stdin.write(b'Hello World\n')
proc.stdin.flush()
print(proc.stdout.readline())
proc.terminate()
main.py
永远挂起。
问题是,如果我使用 ['python', '-i']
创建子流程,它会起作用。
我认为问题出在 while 循环上。您正在打开一个子进程,写入并刷新,它完成了所有这些,但由于循环而从未完成 readline()。
将 sys.stdout.flush()
添加到 echo.py
。如果您 运行 使用 Popen
而不是终端
,则缓冲的工作方式会有所不同。
我创建了一个简单的 echo.py
像这样:
import sys
while True:
s = sys.stdin.readline()
s = s.strip('\n')
if s == 'exit':
break
sys.stdout.write("You typed: %s\n" % s)
它在终端上运行良好。
另一个与 echo.py
交互的程序名为 main.py
import subprocess
if __name__ == '__main__':
proc = subprocess.Popen(['python', 'echo.py'],stdin=subprocess.PIPE,
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
proc.stdin.write(b'Hello\n')
proc.stdin.flush()
print(proc.stdout.readline())
proc.stdin.write(b'Hello World\n')
proc.stdin.flush()
print(proc.stdout.readline())
proc.terminate()
main.py
永远挂起。
问题是,如果我使用 ['python', '-i']
创建子流程,它会起作用。
我认为问题出在 while 循环上。您正在打开一个子进程,写入并刷新,它完成了所有这些,但由于循环而从未完成 readline()。
将 sys.stdout.flush()
添加到 echo.py
。如果您 运行 使用 Popen
而不是终端