2009-07-20 9 views
2

J'essaie de lancer un simple outil de ligne de commande (windows) dans une application PyQt GUI que j'écris. Le problème que j'ai est que l'outil de ligne de commande jette sa progression sur stdout (c'est une commande de réinitialisation du serveur afin que vous obteniez des résultats de type "Attempting to stop" et "Restarting".)Python Impression de StdOut tel qu'il a été reçu

Ce que j'essaie de faire est de capturer sortie donc je peux l'afficher dans le cadre de mon application, je suppose que ce serait assez simple de faire quelque chose comme ce qui suit:.

import os 
import subprocess as sub 
cmd = "COMMAND LINE APP NAME -ARGS" 
proc = sub.Popen(cmd, shell=True, stdout=sub.PIPE).stdout 
while 1: 
    line = proc.readline() 
    if not line: 
     break 
print line 

Cela fonctionne en partie dans ce que je reçois le contenu de StdOut mais au lieu de comme les messages de progression sont envoyés Je l'obtiens une fois que l'application de ligne de commande est sortie et qu'il semble vider StdOut en une fois

e une réponse simple?

+0

double: http://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running –

Répondre

0

Dois-je comprendre la question? Je crois que vous utilisez quelque chose comme "echo first, sleep 60, echo second" et que vous voulez voir le "premier" devancer le "second", mais ils crachent tous les deux en même temps. La raison pour laquelle vous rencontrez des problèmes est que le système d'exploitation stocke la sortie des processus dans sa mémoire. Cela ne prendra que la peine d'envoyer la sortie à votre programme si le tampon a été rempli ou si l'autre programme est terminé. Donc, nous avons besoin de creuser dans l'O/S et de comprendre comment le dire "Hey, Donne-moi!" Ceci est généralement connu comme mode asynchrone ou non-bloquant.

Heureusement, quelqu'un a travaillé dur pour nous. Ce type a ajouté une méthode send() et recv() à la classe Popen intégrée à python. Il semble aussi qu'il a corrigé les bugs que les gens trouvaient dans les commentaires.

Essayez-: http://code.activestate.com/recipes/440554/

Questions connexes