10
votes

Comment obtenir les données STDOUT 'STDOUT Asynchrone?

J'ai écrit un script python simple pour mon application et prédéfini certaines commandes rapides comme la marque, etc.

J'ai écrit une fonction pour exécuter des commandes système (Linux): P>

def runCommand(commandLine):
    print('############## Running command: ' + commandLine)
    p = subprocess.Popen(commandLine, shell = True, stdout = subprocess.PIPE)
    print (p.stdout.read().decode('utf-8'))
  • J'utilise CMAKE em> et c'est la sortie est colorée. Toutes les chances de sauvegarder des couleurs dans la sortie? P> LI>

  • Je peux regarder la sortie après la fin du processus. Par exemple, faire em> fonctionne pendant une longue période, mais je ne peux voir la sortie qu'après la compilation complète. Comment faire de manière asynchrone? P> Li> ul> p>


0 commentaires

6 Réponses :


2
votes

Concernant comment obtenir la sortie de votre processus avant de finir, il devrait être possible de le remplacer: xxx

avec: xxx

Concernant comment sauver une sortie colorée, il n'y a rien de spécial à ce sujet. Par exemple, si la sortie de ligne est enregistrée dans un fichier, alors la prochaine fois CAT est exécuté la console interprétera les séquences d'échappement et displayera les couleurs comme prévu.


3 commentaires

Avec readline () J'ai un chiffre dans la ligne au lieu du texte, qu'est-ce qui ne va pas?


@Ockonal en fait, si vous utilisez la boucle pour la boucle, il n'est pas nécessaire d'utiliser readline . Vous pouvez trouver un exemple de stratégies ici .


En réalité, pour la ligne dans p.stdout n'est pas bon dans Python 2 selon Stackoverflow.com/questions/2804543/...



12
votes

Je ne suis pas sûr des couleurs, mais voici comment interroger la gamme de STDOUT d'une ligne à la fois:

import subprocess
proc = subprocess.Popen('cmake', shell=True, stdout=subprocess.PIPE)
while proc.poll() is None:
    output = proc.stdout.readline()
    print output


0 commentaires

0
votes

Pour faire une sortie ASYNC faire quelque chose comme: http: //aspn.Activestate. com / aspn / recettes / python / recette / 440554

Je ne sais pas si vous pouvez capturer la sortie colorée. Si vous pouvez obtenir les codes de couleur évasés, vous pourrez peut-être.


1 commentaires

Si nous obtenons les codes de couleur, le terminal les traduira. Le problème est cependant, la plupart des applications distinguent la distinction entre étant attachée à un terminal ou se sont déroulées dans une autre application. Le seul moyen de convaincre ces applications de produire toujours les codes de couleur se font semblant que l'application réceptrice (dans ce cas, notre processus de python) est en fait un TTY et non un tuyau. Une tâche beaucoup plus facile à dire qu'à faire ...



4
votes

Vous n'êtes pas de couleur, car CUKE code> détecte si son stdout est un terminal, s'il ne s'agit pas de sa propre sortie. Certains programmes vous donnent une option pour forcer la sortie de coloration. Malheureusement, CMAKE code> ne le fait pas, donc vous n'êtes pas mal de la chance là-bas. À moins que vous ne souhaitiez corriger cmake code> vous-même.

Beaucoup de programmes font cela, par exemple Grep: P>

# grep test test.txt --color=always | cat
test
 ^
 |
 |------- red again


0 commentaires

-1
votes

Noter Voici l'utilisation de la commande script sous forme de pseudo-terminal et être détectée en tant que TTY au lieu du descripteur de fichier de redirection (tuyau), voir: préserver la couleur lorsque la tuyauterie

fonctionne comme un charme ...

Selon l'exemple de la question, laissez simplement script exécuter cmake : xxx

Ce trucs cmake en pensant qu'il est exécuté à partir d'un terminal et produira le bonbon ANSI que vous après.

NJOY!


0 commentaires

1
votes

Pour cumake Spécifiquement, vous pouvez forcer la sortie de couleur à l'aide de l'option clicolor_force = 1 : xxx

puis imprimez comme dans le réponse acceptée : xxx

Si vous décodez à l'UTF-8 avant d'imprimer, vous devez voir la sortie colorée. Si vous imprimez le résultat sous forme de littéral d'octet (c'est-à-dire sans décodage), vous devez voir les séquences d'échappement pour les différentes couleurs.

Envisager d'essayer l'option Universal_newlines = true : xxx

Ceci provoque l'appel à proc.stdout.readline () pour renvoyer une chaîne au lieu d'un location d'octet afin que vous puissiez / dois ignorer l'appel à décodage () .


0 commentaires