Получение небуферизованного вывода из подпроцесса не работает Python

У меня есть основания полагать, что если я запустил его с флагами, он запускает инструмент, который генерирует сообщения все время. Когда я пытаюсь запустить его с подпроцессом, я получаю вывод в cmd, и это нормально. Дело в том, что я хочу взять эти сообщения и что-то с ними сделать, но по какой-то причине метод небуфринга не работает, и я не получаю никаких сообщений.

Ниже приведен код, который я попробовал:

p = subprocess.Popen(
 ["my_tool.exe","runMode","y","port","1234"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT, bufsize=1)

Для генерации вывода попробовал следующее:

for line in p.stdout:
    print("CUR", line)

а также:

while p.poll() is None:
    line = p.stdout.read(2)
    print("Print:" + line)

а также:

for line in iter(p.stdout.readline, b''):
    print(line)
p.stdout.close()

Есть идеи, почему кодовые блоки всегда в строке stdout?

ОБНОВИТЬ:

Например, если у меня есть следующая бесконечная программа:

inf.py

import time
i = 0
while True:
    time.sleep(0.5)
    print(i)
    i += 1

и следующий код, который запускает его:

p = subprocess.Popen(r"C:\Python35\python.exe inf.py",
                     stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)

и для генерации вывода я использую один из вышеперечисленных методов. Если я остановлю его с помощью CTRL+ C, он всегда застрянет в этой строке:

  File "C:\Python35\lib\encodings\cp1252.py", line 22, in decode
    def decode(self, input, final=False):

0 ответов

Сначала я установил следующую переменную окружения:PYTHONUNBUFFERED=1

Затем я немного изменил ваш код:

read_infinite.py

import subprocess

binary = "C:\\Python35\\python.exe"
script = "C:\\temp\\python\\tests\\inf.py"

p = subprocess.Popen([binary, script], stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)

while p.poll() is None:
    #line = p.stdout.read(2)
    line = p.stdout.readline()
    if line:
        print("Result: %r" % line)

Удаление bufsize=1 работает так же.

Сначала я получил ошибку, что inf.py не был найден, но это не было показано, потому что распечатки read_infinite.py прокручивали ошибку. И процесс остановился после большого количества строк "Result:" (переменная "строка" пуста).

Удаление if line: и добавление time.sleep(0.5) после печати (помните import time!) показывает те же результаты.

Итак, решение таково: родитель должен ждать ребенка.

Другие вопросы по тегам