即使关闭stdout,Python子进程readline也会阻塞

时间:2018-12-27 22:12:16

标签: python subprocess

test.py文件

#test.py

#!/usr/bin/env python3

while True:
    inp = input("input: ")
    print("output: " + inp)

subp.py文件:

#subp.py

#!/usr/bin/env python3
from subprocess import Popen, PIPE

cmd = Popen(["python3", "test.py"], stdin=PIPE, stdout=PIPE)

while True:
    print("Writing to stdin")
    cmd.stdin.write("My Input To PIPE")
    print("Done Writing to stdin")
    print("Reading from stdout")
    s = cmd.stdout.readline()
    print("Done reading from stdout") # Never executes this line

输出如下:

Writing to stdin

Done Writing to stdin

Reading from stdout

我了解到s = cmd.stdout.readline()行将被阻塞,直到在EOF文件对象中找到stdout为止。

如果我是对的,除非EOF关闭,否则stdout永远不会在stdout中找到?有人可以纠正我吗?

根据我的理解,如果我修改test.py

import sys

while True:
    inp = input("input: ")
    print("output: " + inp)
    sys.stdout.close() # Added this line hoping to unblock stdout.readline()

什么都没有改变,即使cmd.stdout.readline()已关闭,EOF仍在寻找stdout file吗?

我想念什么?我更关心这个理论,而只是在没有理解的情况下使它起作用。谢谢您的解释

如果修改subp.py并在行cmd.stdout.close()之前添加行s = cmd.stdout.readline(),也会引发错误,提示我尝试从关闭的文件对象中读取内容,这很有意义,但是如何当我通过添加行stdout关闭test.py文件中的sys.stdout.close()文件对象时,它没有引发错误。这两个标准输出是否不同?

0 个答案:

没有答案