[PYTHON] Afficher progressivement la sortie de la commande exécutée par le sous-processus.

J'ai souvent utilisé la méthode «communiquer» lors de l'exécution de commandes externes à l'aide du module de sous-processus.

python:subprocess.Popen.communicate()


import subprocess

(stdoutdata, stderrdata) = subprocess.Popen(['some', 'command'], stdout=subprocess.PIPE).communicate()
print(stdoutdata)

Cependant, si vous voulez sortir le résultat de manière asynchrone comme un script de construction, il ne peut pas être réalisé par la méthode commun. Comme indiqué dans Référence de la bibliothèque, la méthode «commun» attend jusqu'à la fin du processus, après quoi les données de sortie standard sont sorties. Parce que je vais le rendre.

Si vous souhaitez remplir cette condition, vous devez utiliser le module io pour créer un flux correspondant à la sortie du processus enfant.

(ref) http://docs.python.jp/2/library/subprocess.html#subprocess.Popen.stdout (ref) https://gist.github.com/mattbornski/3299031

Flux correspondant à la sortie du processus enfant


def exec_process(commands):
    process = subprocess.Popen(commands, stdout=subprocess.PIPE, bufsize=-1)
    with io.open(process.stdout.fileno(), closefd=False) as stream:
        [print(line.rstrip('\n')) for line in stream]

    #Attendez la fin du processus et jugez le résultat
    process.wait()
    if process.returncode != 0:
        print('Build process aborts.')
        sys.exit(1)

Vous trouverez ci-dessous une note de certains points auxquels j'étais accro

  1. Lors de la création d'un flux avec ʻio.open, vous devez donner le chemin du fichier ou le descripteur de fichier (qui peut être obtenu avec (objet de fichier) .fileno ()). Je ne connais pas le chemin de subprocess.Popen.stdout, donc je dois lui donner un descripteur de fichier. Notez que nous ne donnons pas l'objet de fichier (= subprocess.Popen.stdout`) tel quel.

(ref) http://docs.python.jp/2/library/io.html#io.open

python


# process.io stdout.S'il est donné directement pour ouvrir, il se terminera par une exception d'exécution.
def exec_process(commands):
    process = subprocess.Popen(commands, stdout=subprocess.PIPE, bufsize=-1)
    with io.open(process.stdout, closefd=False) as stream:
        [print(line.rstrip('\n')) for line in stream]
  1. Lors de la création d'un flux avec ʻio.open, vous devez spécifier closefd = False`. La valeur par défaut est «closefd = True», et dans cet état, l'erreur suivante se produit.
close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor

On pense que la cause essaie de fermer l'objet de fichier (= subprocess.Popen.stdout) que le processus enfant tient au moment où le flux est fermé (= dans ce cas, lors de la sortie de l'instruction with).

Recommended Posts

Afficher progressivement la sortie de la commande exécutée par le sous-processus.
Lire la sortie du sous-processus, ouvrir en temps réel
Filtrer la sortie de tracemalloc
Sortie de débogage de la commande calice
Sauvegardez la sortie de GAN une par une ~ Avec l'implémentation de GAN par PyTorch ~
Modification du style par défaut (CSS) des cadres de données pandas générés par affichage dans Google Colab
[Python] Afficher uniquement les éléments de la liste côte à côte [Vertical, horizontal]
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Demandez à python de lire la sortie de la commande
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Afficher le graphique de tensorBoard sur Jupyter
Version Migemo de la commande: find ,: mfind
Pandas du débutant, par le débutant, pour le débutant [Python]
Notez l'achèvement d'une commande chronophage
Afficher tout le corps de l'e-mail du groupe de messagerie recherché par Gmail et réduit
Sortie du nombre de cœurs de processeur en Python
Vérifiez le fonctionnement d'OpenCV3 installé par Anaconda
Afficher rapidement le code QR sur la ligne de commande
Paramètre pour afficher le journal de l'exécution de cron
Trier les éléments d'un tableau en spécifiant des conditions
Afficher la sortie d'une liste de nombres à virgule flottante
Linux: renommez le processus affiché par la commande ps
L'histoire de la mauvaise lecture de la ligne d'échange de la commande supérieure
Comment effacer les caractères générés par Python
Linux: comprendre les informations affichées par la commande top
Minimisez le nombre de polissages en optimisant la combinaison
Juger la finition du mahjong par l'optimisation des combinaisons
Sortie sous la forme d'un tableau python
Rechercher par la valeur de l'instance dans la liste
Obtenez l'emplacement du fichier où se trouve l'exe lors de l'exécution de l'exe créé par PyInstaller
Trier les fichiers mis à jour dans la période spécifiée par la commande find par ordre de taille
Enregistrez la sortie du GAN conditionnel pour chaque classe ~ Avec l'implémentation cGAN par PyTorch ~