Как прочитать вывод командной строки приложения без блокировки, используя Python, когда программа печатает вообще без символа новой строки? - PullRequest
0 голосов
/ 13 февраля 2020

Я запускаю приложение abc.exe из скрипта Python, используя subprocess.Popen. Программа запускается в главном потоке, и вывод считывается из другого отдельного потока, используя PIPE с функцией stdout.readline.

Но функция readline блокирует поток чтения, пока не встретит символ новой строки в stdout. И программа abc.exe не выводит символ newline, если он не завершен. К сожалению, приложение не может быть изменено для печати с помощью newline.

Это заставляет функцию readline продолжать ждать и выводит все, что программа печатает, когда я завершаю сценарий Python. Но я хочу прочитать это в режиме реального времени, как только программа напечатает. Пожалуйста, помогите!

Вот код, который я использовал.

import subprocess
import threading
import Queue
import time
from subprocess import PIPE
outq = Queue.Queue()

def output_reader(self,proc,outq):
    for line in iter(proc.stdout.readline, b''):
        outq.put(line.decode('utf-8'))
    for error in iter(proc.stderr.readline, b''):
        outq.put(line.decode('utf-8'))

comm = "vmf.exe -m"

ans = subprocess.Popen(comm,shell=True,stdout=PIPE,stderr=PIPE)
t = threading.Thread(target=output_reader, args=(ans,outq))
t.start()
while True:
    if outq.qsize() > 0:
        line = outq.get(block=False)       #get the output line
        if "failed" in line:               #check if the line contains the word "failed"
            ans.terminate()                #if True, then restart the existing process
            time.sleep(3)
            ans = subprocess.Popen(comm,shell=True,stdout=PIPE,stderr=PIPE)
...