与交互式程序通信时,进程挂起

时间:2019-07-15 09:08:01

标签: python subprocess interactive

我已经创建了一个简单的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']创建子流程,它将起作用。

2 个答案:

答案 0 :(得分:1)

sys.stdout.flush()添加到echo.py。如果您使用Popen而不是终端运行进程,则缓冲的工作方式有所不同。

答案 1 :(得分:0)

我相信问题是while循环。您正在打开一个子进程,对其进行写入和刷新,然后它完成了所有工作,但由于循环而从未完成readline()。