La synchronisation de la sortie est incorrecte lorsque la sortie standard (erreur) est convertie en fichier en Python

introduction

Est-ce juste mon environnement?

Dans un script Python, lorsque la sortie standard (erreur) est convertie en fichier ou exécutée à partir d'un autre script Python, le timing de sortie est incorrect. Il sort immédiatement lorsque le processus se termine, pas lorsque print ou sys.stdout.write est exécuté.

Écrire dans un fichier

Script avec un timing de sortie étrange

Il s'agit du script Python exécuté. Donnez simplement un nombre chaque seconde.

child1.py


from time import sleep

for i in range(10):
    print(str(i))
    sleep(1)

Quand ceci est exécuté avec la commande suivante, rien n'est sorti et un journal est sorti à la fois après 10 secondes.

$  python3 ./child1.py > stdout.log & tail -f stdout.log

Version modifiée

Vient ensuite la version modifiée. Essayez d'exécuter sys.stdout.flush après l'impression.

child2.py


from time import sleep
import sys

for i in range(10):
    print(str(i))
    sys.stdout.flush()
    sleep(1)

De même, si vous exécutez la commande suivante, elle sera sortie toutes les secondes.

$  python3 ./child2.py > stdout.log & tail -f stdout.log

Au fait,

$  python3 ./child1.py

Et, il n'y a aucun problème de sortie à l'écran.

Appel depuis un autre script Python

En tant que script parent, j'ai utilisé celui publié dans ici.

parent.py


import sys
import subprocess

def get_lines(cmd):
    '''
    :param cmd:commande str à exécuter.
    :rtype: generator
    :return:Sortie standard(Ligne par ligne).
    '''
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        line = proc.stdout.readline()
        if line:
            yield line.decode('utf-8')

        if not line and proc.poll() is not None:
            break

if __name__ == '__main__':
    for line in get_lines(cmd='python3 ./child1.py'): # ./child2.Quand je lance py, il sort toutes les secondes
        sys.stdout.write(line)

Avec cela, même lors de la sortie à l'écran, child1.py est sorti en une fois après 10 secondes et child2.py est sorti toutes les 1 seconde.

Conclusion

Est-ce une telle chose? → Une telle chose.

(Une addition) Comme indiqué dans le commentaire ci-dessous, il a été confirmé que si l'option -u est ajoutée lors de l'exécution de la commande python3, elle sera sortie à tout moment. Je suis redevenu plus intelligent. \ # Je vais essayer d'écrire le système "Je n'ai pas pu le faire".

Recommended Posts

La synchronisation de la sortie est incorrecte lorsque la sortie standard (erreur) est convertie en fichier en Python
Changer la destination de sortie standard en un fichier en Python
Écrire la sortie standard dans un fichier
Déterminer si la sortie standard est acheminée lors de l'exécution d'un script Python
Comment créer un fichier JSON en Python
Comment générer "Ketsumaimo" en standard en Python
Erreur lors de la tentative d'installation de psycopg2 en Python
[Python] Choses à vérifier lorsqu'une erreur de décodage Unicode apparaît dans Django
Analyser une chaîne JSON écrite dans un fichier en Python
Un mémorandum pour exécuter un script python dans un fichier bat
Je veux échantillonner au hasard un fichier avec Python
Choses à noter lors de l'initialisation d'une liste en Python
Utilisez communiquer () lors de la réception de la sortie dans un sous-processus Python
Sortie d'un vidage binaire en binaire et retour dans un fichier binaire
Lors de la publication d'un package sur PyPI, «Erreur HTTP: 400 Erreur du client: le fichier existe déjà.» S'affiche.
Comment importer des fichiers où vous le souhaitez en Python
Un moyen standard de développer et de distribuer des packages en Python
[Python] Comment générer une table pandas dans un fichier Excel
Notification Slack lorsqu'un mot spécifique est murmuré sur Twitter en utilisant Heroku avec python
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
Sortie vers un fichier csv avec Python
Rendre la sortie standard non bloquante en Python
Créer un fichier binaire en Python
Lors de l'écriture d'un programme en Python
Exporter la liste de clés incluse dans S3 Bucket dans un fichier
Convertir en chaîne lors de la sortie de la sortie standard avec le sous-processus Python
J'ai essayé de transformer un fichier Python en un EXE (erreur de récursivité prise en charge)
[Introduction à Python] Comment générer une chaîne de caractères dans une instruction Print
[Python] Temps d'exécution lorsqu'une fonction est saisie dans une valeur de dictionnaire
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Spécification du fuseau horaire lors de la conversion d'une chaîne de caractères en type datetime avec python
[Python] Lorsque vous souhaitez utiliser toutes les variables dans un autre fichier
"Erreur de valeur: impossible de configurer le gestionnaire'file_output_handler '" lors du démarrage d'un programme python
Convertir un script Python écrit dans PyTorch en exe avec PyInstaller
Que faire lorsque le type de valeur est ambigu en Python?
Convertir automatiquement en fichier py lorsque le fichier ui est mis à jour par PySide
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
Que faire s'il y a un décimal dans python json .dumps
Créez des raccourcis pour exécuter des fichiers Python sur le terminal avec VScode
Précautions lors du décapage d'une fonction en python
Convertir un fichier psd en png en Python
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Comment obtenir stacktrace en python
Je souhaite convertir une table convertie en PDF en Python en CSV
Hash en Perl est un dictionnaire en Python
[Python] Que faire lorsqu'une erreur liée à l'authentification SSL est renvoyée
Comment écrire une chaîne de caractères lorsqu'il y a plusieurs lignes en python
[GPS] Créer un fichier kml avec Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Erreur due à UnicodeDecodeError lors de la lecture d'un fichier CSV avec Python [Pour les débutants]
Comment utiliser is et == en Python
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Que faire lorsqu'un message d'avertissement est affiché dans la liste des pip
Que faire si vous obtenez l'erreur RuntimeError: Python n'est pas installé en tant que framework lorsque vous essayez d'utiliser matplitlib et pylab dans Python 3.3
J'ai créé un script pour vérifier si l'anglais est entré dans la position spécifiée du fichier JSON en Python.
Différentes façons de lire la dernière ligne d'un fichier csv en Python
[python] Que faire si vous obtenez une erreur avec send_keys dans le chrome sans tête
Comment déposer Google Docs dans un dossier dans un fichier .txt avec python
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.