Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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
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
<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.
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
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.
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