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>
6 Réponses :
Concernant comment obtenir la sortie de votre processus avant de finir, il devrait être possible de le remplacer: avec: p> 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
Avec readline () code> 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 code>. Vous pouvez trouver un exemple de stratégies ici .
En réalité, pour la ligne dans p.stdout code> n'est pas bon dans Python 2 selon Stackoverflow.com/questions/2804543/...
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
Pour faire une sortie ASYNC faire quelque chose comme: http: //aspn.Activestate. com / aspn / recettes / python / recette / 440554 p>
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. P>
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 ...
Vous n'êtes pas de couleur, car Beaucoup de programmes font cela, par exemple Grep: P> 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.
# grep test test.txt --color=always | cat
test
^
|
|------- red again
Noter Voici l'utilisation de la commande fonctionne comme un charme ... p> Selon l'exemple de la question, laissez simplement Ce trucs NJOY! P> P> script code> 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
script code> exécuter
cmake code>: p>
cmake code> en pensant qu'il est exécuté à partir d'un terminal et produira le bonbon ANSI que vous après. p>
Pour cumake Spécifiquement, vous pouvez forcer la sortie de couleur à l'aide de l'option puis imprimez comme dans le réponse acceptée : p> 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. P> Envisager d'essayer l'option Ceci provoque l'appel à clicolor_force = 1 code>:
Universal_newlines = true code>: p>
proc.stdout.readline () code> pour renvoyer une chaîne au lieu d'un location d'octet afin que vous puissiez / dois ignorer l'appel à
décodage () code>. p> p>