2009-12-18 3 views
2

J'écris une application python qui exécute plusieurs sous-processus en utilisant des objets subprocess.Popen. J'ai une interface graphique glade et je veux afficher la sortie de ces commandes (en cours d'exécution dans subprocess.Popen) dans le GUI en temps réel.GUI Python (glade) pour afficher la sortie du processus shell

Quelqu'un peut-il suggérer un moyen de le faire? Quel objet glade dois-je utiliser et comment rediriger la sortie?

Répondre

1

Après beaucoup de lecture et ne pas obtenir les résultats que je voulais, j'ai trouvé une autre méthode qui fonctionne.

Il va comme ceci

#!/usr/bine/env python 
import subprocess 
import gtk 

### Of course, you should have the gui built and know which widgets to use for this. 
viewer = self.builder.get_widget('txtview') 
proc = subprocess.Popen('ls -al /home'.split(), stdout=subprocess.PIPE, stderr = subprocess.STDOUT) 
while True: 
    line = proc.stdout.readline() 
    viewer.get_buffer().instert_at_cursor(line) 
    if not line: 
     break 
1

Glade est seulement un programme de construction interfaces graphiques avec GTK donc quand vous demandez un objet Glade vous devriez peut-être demander gtk widget de et dans ce TextBuffer cas et textview chould être une solution ou TreeView peut-être et liststore. subprocess.Popen a stdout et stderr arguments qui peuvent accepter un objet de type fichier. vous pouvez créer un adaptateur qui écrit dans le textbuffer ou ajouter des éléments dans le listtore

+0

Je me suis trompé ... Je ne voulais widget GTK. Maintenant, à propos de cet adaptateur, pouvez-vous fournir plus de détails? Voulez-vous dire comme un objet timer qui lit constamment le stdout et le stderr et l'écrit dans le widget gtk? ou avez-vous quelque chose de différent à l'esprit? –

+0

Je pensais que Popen écrit la sortie dans l'objet-fichier à la place il utilise la méthode .fileno() et os.fdopen() pour ce descripteur de fichier (et je ne sais pas pourquoi). donc vous pouvez utiliser .communicate() qui lit toute la sortie en mémoire jusqu'à ce que le processus se termine. Si ce n'est pas une option pour vous, vous devez utiliser PIPE et en lisant constamment (peut-être à partir d'un thread). espérons que cela a aidé plus –

Questions connexes