Suivez et lisez la sortie du contenu vers la sortie standard avec subprocess.Popen. À ce stade, au lieu d'utiliser readline () pour lire chaque saut de ligne, utilisez read () pour lire (?). Je m'inquiète souvent du flux, alors prenez note
J'ai confirmé l'opération avec Python 2.7.5 sur CentOS7.
C'est le script qui est lancé par Popen.
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)
Un script simple qui imprime «[Count 0000]» chaque seconde. Cependant, comme il ne casse pas, il ne peut pas être lu par readline ().
Appelez le script ci-dessus avec Popen et lisez la sortie standard.
reader.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, time, errno, fcntl
from subprocess import Popen, PIPE
#Textout avec Popen.Exécuter py
#En ce moment à python-Passez l'option u pour éviter la mise en mémoire tampon
p = Popen([sys.executable, "-u", "textout.py"], bufsize=0, stdout=PIPE)
# p.Mettre stdout en mode non bloquant
flag = fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL)
fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, flag | os.O_NONBLOCK)
while True:
#Boucle de lecture
try:
# p.Lire stdout
#Puisqu'il s'agit d'un mode non bloquant, lisez autant que vous pouvez lire
buf = p.stdout.read()
if buf == "": break # p.Quitter lorsque stdout est fermé
sys.stdout.write(buf) #Sortez ce que vous lisez
sys.stdout.flush() #Rincer car il n'y a pas de saut de ligne()
except IOError, e:
#IOError s'il n'y a rien à lire(11,
# "Resource temporarily unavailable")Mais
#Attends car il sera jeté
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]» est émis toutes les secondes.
Recommended Posts