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()
文件对象时,它没有引发错误。这两个标准输出是否不同?