Readline подпроцесса Python блокируется даже после закрытия стандартного вывода - PullRequest
0 голосов
/ 28 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...