Folgen Sie und lesen Sie die Inhaltsausgabe zur Standardausgabe mit subprocess.Popen. Verwenden Sie zu diesem Zeitpunkt readline () zum Lesen jedes Zeilenumbruchs, anstatt readline () zum Lesen (?). Ich mache mir oft Sorgen um den Stream, also mach dir eine Notiz.
Ich habe den Vorgang mit Python 2.7.5 unter CentOS7 bestätigt.
Dies ist das Skript, das von Popen gestartet wird.
textout.py
#!/usr/bin/env python
import sys
import time
for i in range(0, 10):
sys.stdout.write("[Count {0:04d}]".format(i))
time.sleep(1)
Ein einfaches Skript, das jede Sekunde "[Count 0000]" druckt. Da es jedoch nicht kaputt geht, kann es nicht von readline () gelesen werden.
Rufen Sie das obige Skript mit Popen auf und lesen Sie die Standardausgabe.
reader.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, time, errno, fcntl
from subprocess import Popen, PIPE
#Textout mit Popen.Führen Sie py aus
#Zu dieser Zeit zu Python-Übergeben Sie die Option u, um eine Pufferung zu vermeiden
p = Popen([sys.executable, "-u", "textout.py"], bufsize=0, stdout=PIPE)
# p.Versetzen Sie stdout in den nicht blockierenden Modus
flag = fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL)
fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, flag | os.O_NONBLOCK)
while True:
#Leseschleife
try:
# p.Lesen Sie stdout
#Da es sich um einen nicht blockierenden Modus handelt, lesen Sie so viel wie möglich
buf = p.stdout.read()
if buf == "": break # p.Beenden Sie, wenn stdout geschlossen ist
sys.stdout.write(buf) #Geben Sie aus, was Sie gelesen haben
sys.stdout.flush() #Spülen, da kein Zeilenumbruch vorliegt()
except IOError, e:
#IOError, wenn nichts zu lesen ist(11,
# "Resource temporarily unavailable")Aber
#Warten Sie, weil es geworfen wird
if e.errno == errno.EAGAIN:
time.sleep(0.1)
p.wait()
$ ./reader.py
[Count 0000][Count 0001][Count 0002][Count 0003][Count 0004][Count 0005][Count 0006][Count 0007][Count 0008][Count 0009]
[Count 0000]
wird jede Sekunde ausgegeben.
--Puffern Sie nicht, wenn Sie textout.py oder flush () ausführen, nachdem Sie in sys.stdout geschrieben haben --reader.py liest p.stdout mit read (), also im nicht blockierenden Modus lesen
Recommended Posts