Я запускаю приложение 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)