OVH Cloud OVH Cloud

afficher le stdout d'une commande dans une GUI

7 réponses
Avatar
twigster
Bonjour,

je cherche à afficher en direct la sortie d'une commande exécutee par
exemple par os.system ou os.popen dans un Pmw.ScrolledText ou un
quelconque autre widget. Il faut que la sortie de la commande soit
lisible par l'utilisateur de une GUI utilisant Tkinter au cours du calcul.

merci d'avance
Alexandre

7 réponses

Avatar
Eric Brunel
On Mon, 19 Dec 2005 18:10:20 +0100, twigster wrote:

Bonjour,

je cherche à afficher en direct la sortie d'une commande exécutee par
exemple par os.system ou os.popen dans un Pmw.ScrolledText ou un
quelconque autre widget.


os.popen et Pmw.ScrolledText seront très bien, oui.

Il faut que la sortie de la commande soit
lisible par l'utilisateur de une GUI utilisant Tkinter au cours du calcul.


Oui, d'accord. Et sinon, c'est quoi la question? Qu'est-ce que tu as essayé de faire? Qu'est-ce qui ne marche pas?
--
python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"

Avatar
twigster
os.popen me donne la sortie d'un programme à la fin de son execution or
je voudrais avoir acces au degré d'avancement du calcul. Ceci est donné
par ce qui s'affiche au fur et à mesure du calcul dans le stdout.

L'idée la plus bête que j'ai trouvé pour lancer et suivre un process
depuis un GUI et d'afficher dans un Pmw.ScrolledText la sortie en temps
réel mais si qq a une autre idée je suis preneur.

merci
Alexandre
Avatar
Eric Brunel
On Tue, 20 Dec 2005 11:34:25 +0100, twigster wrote:
os.popen me donne la sortie d'un programme à la fin de son execution


Euh..., non? os.popen te donne la sortie de la commande au fur et à mesure de son exécution, mais en général en mode bufferisé, ce qui va générer des "à-coups".

or
je voudrais avoir acces au degré d'avancement du calcul. Ceci est donné
par ce qui s'affiche au fur et à mesure du calcul dans le stdout.


Je pense que ton problème vient simplement du fait que tu ne mets pas à jour l'affichage suffisamment souvent (voire pas du tout). Appeler la méthode update_idletasks sur ton Pmw.ScrolledText ou sur n'importe quel widget Tkinter régulièrement (par exemple à chaque fois que tu lis une ligne dans le pipe) devrait résoudre ton problème.

L'idée la plus bête que j'ai trouvé pour lancer et suivre un process
depuis un GUI et d'afficher dans un Pmw.ScrolledText la sortie en temps
réel mais si qq a une autre idée je suis preneur.


Eh? Je ne comprends pas ce que tu veux dire. Pourrais-tu poster un bout de code, stp? Ca aiderait à comprendre ce que tu fais et pourquoi ça ne marche pas...
--
python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"

Avatar
twigster
ok disons que j'ai

command = 'moncode -i in -o out -param p'
out = os.popen(command)

st = Pmw.ScrolledText(parent)
st.pack()

ensuite je veux afficher out dans st

je sais faire à partir d'un fichier en ajoutant > file.txt à command
mais ca se pas portable sous windows je pense.
Ex:
st.importfile('file.txt')

ou a partir d'un string
st.appendtext('mon texte')

j'imagine que je peux faire
st.appendtext(out.writelines)

éventuellement

line = out.writeline
while not line:
st.appendtext(line)
line = out.writeline

[q] est-ce que c'est ce que vous suggérez?
[q] si oui comment savoir quand le process est fini pour arreter de
faire boucler le while?

merci
Alexandre
Avatar
Eric Brunel
On Tue, 20 Dec 2005 14:36:40 +0100, twigster wrote:

ok disons que j'ai

command = 'moncode -i in -o out -param p'
out = os.popen(command)

st = Pmw.ScrolledText(parent)
st.pack()


Jusqu'ici, tout va bien.

ensuite je veux afficher out dans st

je sais faire à partir d'un fichier en ajoutant > file.txt à command
mais ca se pas portable sous windows je pense.
Ex:
st.importfile('file.txt')

ou a partir d'un string
st.appendtext('mon texte')


(Pour les méthodes importfile et appendtext, je suppose que tu sais ce que tu fais: je ne les ai jamais utilisées et je ne savais même pas qu'elles existaient. J'en était resté à la bonne vieille méthode monTexte.insert('end', chaine))

j'imagine que je peux faire
st.appendtext(out.writelines)


Ben non:
- d'abord, out.writelines *écrit* les lignes et ne les lit pas
- ensuite, pour appeler la méthode, il faut des parenthèses: out.writelines() ou out.readlines()
- même avec les parenthèses et la bonne méthode, out.readlines() renvoie une *liste* de lignes, et pas une chaîne simple; donc tu ne paux pas la passer telle qu'elle à st.appendtext, qui - je suppose - attend une chaîne.

éventuellement

line = out.writeline
while not line:
st.appendtext(line)
line = out.writeline


Moi, je dirais:

line = out.readline()
while line:
st.appendtext(line)
st.update_idletasks()
line = out.readline()

ou même plutôt:

for line in out:
st.appendtext(line)
st.update_idletasks()

[q] est-ce que c'est ce que vous suggérez?
[q] si oui comment savoir quand le process est fini pour arreter de
faire boucler le while?


Le dernier out.readline() renverra la chaîne vide lorsqu'il n'y a plus rien à lire, c'est à dire lorsque la commande lancée via le popen aura fermé sa sortie standard. On peut raisonnablement supposer que si elle fait ça, c'est qu'elle est terminée (de toutes façons, même si elle ne l'est pas, elle ne pourra plus rien afficher...).

merci


Pas de mal.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"

Avatar
Do Re Mi chel La Si Do
Bonsoir !


Juste un détail :

ajoutant > file.txt à command mais ça se pas portable sous windows je
pense




Ben si. Windows accepte très bien la redirection ; ">" et ">>" (la seconde
forme ajoutant au fichier, au lieu de récréer le fichier).


@-salutations

Michel Claveau



Avatar
R12y
merci
Pas de mal.

Tes ligens sont trop longues.


--
Telephone portable "intelligent" (SmartPhone) GSM, GPRS,...
Il est sous Linux, ne coute pas trop cher,...
http://www.it2l.com/product_info.php?cPath‘&products_idE6