файл 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()
.Это две разные вещи?