[PYTHON] Lire la sortie du sous-processus, ouvrir en temps réel

Aperçu

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.

Script de sortie de caractères

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 ().

Script d'exécution

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()

Résultat d'exécution

$ ./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.

point

Recommended Posts

Lire la sortie du sous-processus, ouvrir en temps réel
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Sortie sous la forme d'un tableau python
Afficher progressivement la sortie de la commande exécutée par le sous-processus.
Affiche l'heure à partir du moment où le programme a été lancé en python
Obtenez une sortie standard en temps réel avec le sous-processus Python
Filtrer la sortie de tracemalloc
Lire la sortie Fortran avec python
Enquête sur l'utilisation du machine learning dans les services réels
Résumé des points d'achoppement à Django pour la première fois
Trouver les valeurs propres d'une vraie matrice symétrique en Python
L'histoire de la participation à AtCoder
Demandez à python de lire la sortie de la commande
Traiter le résultat de% time,% timeit
L'histoire du "trou" dans le fichier
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
Lisez l'image du jeu de puzzle et sortez la séquence de chaque bloc
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
Une fonction qui mesure le temps de traitement d'une méthode en python
Vérifier le taux de compression et le temps de PIXZ utilisé en pratique
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
[Comprendre en 3 minutes] Le début de Linux
Vérifiez le comportement du destroyer en Python
L'histoire d'une erreur dans PyOCR
Arborescence de sortie des fichiers en Python
Implémenter une partie du processus en C ++
Lire tous les fichiers csv dans le dossier
Le résultat de l'installation de python sur Anaconda
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
MongoDB avec Python pour la première fois
Principes de base pour exécuter NoxPlayer en Python
Différence de sortie de la fonction de fenêtre de longueur paire
Conversion des données de temps en notation 25 heures
Lire tout le contenu de proc / [pid]
À la recherche du FizzBuzz le plus rapide en Python
Lire l'implémentation de la minuterie globale ARM
Obtenez une instance datetime à tout moment de la journée en Python
[Python] Lire la ligne spécifiée dans le fichier
[IOS] Modifiez la durée d'affichage de chaque image de l'animation GIF dans Pythonista3.
Différentes façons de lire la dernière ligne d'un fichier csv en Python
[Linux] Différence d'informations temporelles en fonction de l'ID d'horloge de la fonction clock_gettime ()
Visualisez les informations du capteur d'accélération de la carte micro-ordinateur en temps réel avec mbed + Python
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
Obtenir l'heure Unix de l'heure spécifiée par JST quel que soit le fuseau horaire du serveur avec Python
Je souhaite stocker les résultats de% time, %% time, etc. dans un objet (variable)
[Python] Lire le code source de Bottle Part 2
Signification de {numéro de version} dans le package mysql rpm
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Raccourcir le temps d'analyse d'Openpose à l'aide du son
J'ai lu l'implémentation de range (Objects / rangeobject.c)
Paramètre pour afficher le journal de l'exécution de cron
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Copiez la liste en Python
Trouvez le nombre de jours dans un mois