Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

récupérer la sortie stndard meme si la commande n'est pas finie.

4 réponses
Avatar
JB BUTET
Bonjour à tous :)

Je suis en train de faire une GUI qui construit un script, puis je lance
ce script par un executable (sous linux).

Il n'est pas rare que le tps d'éxécution de ce script soit très long.

j'aimerai donc faire une barre de progression.

J'utilise pour le moment :
status, output = commands.getstatusoutput("macommande "+ mon script)

mais cela freeze... (ca a pas l'air threadé)
et surtout, je ne récupère "output" que à la fin. (donc pour faire une
barre de progression...)

J'ai entendu parler de cette possibilté avec os.popen, quelqu'un a-t-il
déjà tenté ?

A+

JB

4 réponses

Avatar
Laurent Pointal
Bonjour à tous :)

Je suis en train de faire une GUI qui construit un script, puis je lance
ce script par un executable (sous linux).

Il n'est pas rare que le tps d'éxécution de ce script soit très long.

j'aimerai donc faire une barre de progression.

J'utilise pour le moment :
status, output = commands.getstatusoutput("macommande "+ mon script)

mais cela freeze... (ca a pas l'air threadé)
et surtout, je ne récupère "output" que à la fin. (donc pour faire une
barre de progression...)

J'ai entendu parler de cette possibilté avec os.popen, quelqu'un a-t-il
déjà tenté ?

A+

JB


En zieutant rapidement le module treetaggerwrapper.py [**] que j'ai
écrit ,il y a quelques temps:

Tu démarres ton process via qq chose comme[*]:
input,output = os.popen2(cmd)

Tu écrits via input.write()

Tu lis via output.read()


Donc, il suffit de mettre le output.read() dans un thread qui se charge
de notifier périodiquement l'interface graphique de l'avancement afin
qu'elle se mette à jour.

Pour le input.write(), si les données à envoyer n'existent pas ou sont
limitées, tu peux les écrires immédiatement après le popen2, puis faire
simplement input.close(). Par contre, s'il y a pas mal de données, ça
peut être bien de créer un thread qui s'occupe de les fournir peu à peu
à ton process externe.


A+

Laurent.


[*] Tu peux aussi utiliser subprocess.Popen et lui spécifier
subprocess.PIPE pour le parmaètre stdout de construction, après tu
accèdes à l'attribut stdout de l'objet créé et tu peux faire des read()
dessus.

[**] http://www.limsi.fr/Individu/pointal/python/treetaggerwrapper-doc/
http://laurent.pointal.org/python/projets/treetaggerwrapper/index.pih

Avatar
JB BUTET
Salut :)


En zieutant rapidement le module treetaggerwrapper.py [**] que j'ai
écrit ,il y a quelques temps:

Tu démarres ton process via qq chose comme[*]:
input,output = os.popen2(cmd)

Tu écrits via input.write()

Tu lis via output.read()


ouaip... mais y'a une feinte :)

c'est que le programme ne me laisse pas la main... c'est a dire que je
lance :
executable

ca dure... 20 secondes mais la sortie standard n'est pas *cherche les
mots* coupée.
Elle est en une seule fois... et ça ca ne passe pas.

Il va falloir que je modifie 2-3 trucs. Peut etre intégrer directement
le code C dans python... ;)

A+

JB

Avatar
Cémoi

<snip>

Ne pas oublier de "vider" la sortie (output.flush dans l'exemple de
Laurent) si on veut garantir une écriture effective via le pipe.
Cette remarque vaut autant pour le partie "script" de ta problématique
que pour la partie GUI.

HTH,

Laurent
Avatar
Laurent Pointal

Il va falloir que je modifie 2-3 trucs. Peut etre intégrer directement
le code C dans python... ;)


Ben, suivant ce qu'il fait et comment il est écrit, ça peut être
envisageable et après beaucoup plus simple à l'utilisation.

Cf http://www.limsi.fr/Individu/pointal/python-works.html#cours
la partie Liaison Python/C

A+

Laurent.