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é.
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
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.
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.
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".