Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/02/2008, à 22:43

atlas2003

Question python

Bonjour a tous.

Aujourd'hui j'ai une petite question python.
Je suis en train de faire une petite GUI qui me lancera un script bash avec des parametres.

La question est tout simple: Comment puis je appeler mon script bash et qu'il s'execute dans une console histoire de voir ce qu'il se passe EN TEMPS REEL pendant le deroulement du script?

Je n'ai pas encore essayé mais je supose que si j'utilise os.system, ca va etre lancé en background.

merci et bonne fin de soirée!

Dernière modification par atlas2003 (Le 03/02/2008, à 22:24)


Blabla autour d'Ubuntu > http://back2web.com/blabla/

Hors ligne

#2 Le 03/02/2008, à 22:24

atlas2003

Re : Question python

Un petit up...

quelqu'un a deja du faire ca je supose?

J'ai essayé avec plusieurs commande basique mais la plupart me renvoit l'info une fois que le script bash appelé est terminé.


Blabla autour d'Ubuntu > http://back2web.com/blabla/

Hors ligne

#3 Le 03/02/2008, à 23:03

kaer

Re : Question python

Vas lire la doc du module subprocess (Python>=2.4), je crois que tu trouveras ton bonheur.
Le tout est d'envoyer vers ton gui les sorties de Popen et d'envoyer en entrée vers Popen ec que l'utilisateur introduis dans le GUI.
Je n'ai pas le temps de lefaire là  mais n'hésite pas soit à  poster le script qui le fait ou les questions que tu aurais encore, ça m'interesse aussi.

Hors ligne

#4 Le 04/02/2008, à 00:53

atlas2003

Re : Question python

Merci pour ta reponse. En effet, c'est un peu ce que je cherche.

J'ai fais un test comme ceci:

import string, os
cmd = 'sh /home/nicolas/Desktop/video2pmp/video2pmp.sh -if /media/data/data/1.avi' 

for line in os.popen(cmd).readlines():
	print line

Malheuresement, cela marche à  moitié.
Je dis "à  moitié" car cela m'affiche bien l'ouput de ma commande, mais pas toute. Celle qui ne s'affiche pas sont celle qui reste sur la meme ligne.

Je ne suis pas clair smile je vais donner un exemple ca sera plus simple.
Le test que je viens de faire appelle un script bash qui lui appelle mencoder.
Quand on encode des videos avec mencoder, les premieres lignes qu'envoit en output mencoder, c'est des infos general sur la video, comme sa tailles, les codec etc...
Une fois qu'il a envoyé ca, l'encodage commence. Et la il y a un pourcentage qui augmente. Mais mencoder ne creer pas une nouvelle ligne dans l'output pour chaque %. Il utilise la meme ligne qui se refresh a chaque fois.
A la limite j'aurais trouvé ca un peu logique si je voyais au moins UNE fois cette ligne dans mon test, mais en fait non, elle n'apparait jamais, meme pas une seule fois.

Je continu mes recherches.
Si jamais tu as une idée, je suis preneur smile

encore merci kaer!


EDIT:
J'ai trouvé un post assez interessant qui parle du meme probleme:
http://www.velocityreviews.com/forums/t340801-subprocesspopen-redirecting-to-tkinter-or-wxpython-textwidget.html

Sur le dernier post de la page, il y une solution proposé, mais comme il n'y a pas de reponse je ne sais pas si ca marche. Par contre c'est un peu trop abstrait pour moi...
Peut etre que quelqu'un avec de meilleurs connaissance pourrait en dire un peu plus?

Dernière modification par atlas2003 (Le 04/02/2008, à 04:21)


Blabla autour d'Ubuntu > http://back2web.com/blabla/

Hors ligne

#5 Le 04/02/2008, à 11:28

kaer

Re : Question python

atlas2003 a écrit :

... Je dis "à  moitié" car cela m'affiche bien l'ouput de ma commande, mais pas toute. Celle qui ne s'affiche pas sont celle qui reste sur la meme ligne.

Je ne suis pas clair smile ...

Si si, je crois comprendre. Un peu comme si tu voulais récupérer le pourcentage d'avancement de wget par exemple. J'ai déjà  eu ce probléme et je l'ai contourné en trouvant dans les options du programme en ligne de commande que j'utilisais une option (style -f monfichier de sortie) qui envoyait les infos dont j'avais besoin vers un fichier que que je lisais au fur et à  mesure dans mon script Python. J'espère que tu pourras faire pareil.

Tiens nous au courant et de toutes façons, la "vraie solution" m'interesse aussi alors comme tu disais:

atlas2003 a écrit :

Peut etre que quelqu'un avec de meilleurs connaissance pourrait en dire un peu plus?

Hors ligne

#6 Le 04/02/2008, à 11:52

kaer

Re : Question python

Je viens d'aller voir la solution que tu as trouvée. Je pense que si tu tentes quelque chose de ce genre, tu devrais d'abord décider et préciser le librairie GUI que tu utiliseras car la solution sera peut-être spécifique à  cette librairie. Par exemple en wx, tu as wxProcess, wxExecute ... qui peuvent faire le job. Avec éventuellement des subtilités telles que celles que tu mentionnes (http://www.velocityreviews.com/forums/t340801-subprocesspopen-redirecting-to-tkinter-or-wxpython-textwidget.html)

Hors ligne

#7 Le 04/02/2008, à 12:13

kaer

Re : Question python

Désolé de cette rafalle de réponses, je t'envoie mes idées comme elles viennent ...
Donc, je repensais à  wget et si la comparaison avec ton probléme est pertinente, il y a une solution ici :
http://www.koders.com/python/fid78B9D685BCD7354BF15EB2F4E7ECC97E5DE82DEF.aspx

Pour info ce code tourne ou a tourné dans une application gtk (gPodder) ou le pourcentage de download est affiché graphiquement.

Hors ligne

#8 Le 04/02/2008, à 15:28

atlas2003

Re : Question python

Merci pour toute tes reponses
Oui, c'est bien du wxPython pour le GUI.
Ca a l'air d'etre un bon exemple le dernier que tu as trouvé.
Des que j'aurais un peu de temps je vais essayer d'implementer ca et je donnerai des nouvelles.

Merci!


Blabla autour d'Ubuntu > http://back2web.com/blabla/

Hors ligne

#9 Le 05/02/2008, à 01:35

atlas2003

Re : Question python

Me voila chez moi. Apres une longue journée de travail,je n'ai pas pu resister a l'envie de tester tout ca smile

Apres 15 petites minutes et en melangeant le site que j'ai trouvé hier plus le tient qui parle du wget, je suis arrivé a ca:

#!/usr/bin/env python
 
import popen2

cmd = ['/home/nicolas/Desktop/video2pmp/video2pmp.sh', '-if', "/media/divx/test.avi",'-d','00:01']


process = popen2.Popen3( cmd, True)

pid = process.pid
stderr = process.fromchild

msg=""
while process.poll() == -1:
	
	lettre = stderr.read(1)
	msg = msg + lettre
	
	if lettre == chr(13):
		print msg
		msg=''

Et ca donne une sortie comme ceci:

Pos:  17.5s    526f ( 0%) 138.31fps Trem:   6min 114mb  A-V:0.000 [540:0]
Pos:  17.6s    527f ( 1%) 138.18fps Trem:   6min 113mb  A-V:0.000 [541:0]
Pos:  17.6s    528f ( 1%) 137.97fps Trem:   6min 114mb  A-V:0.000 [543:0]
Pos:  17.6s    529f ( 1%) 137.83fps Trem:   6min 113mb  A-V:0.000 [543:0]
Pos:  17.7s    530f ( 1%) 137.66fps Trem:   6min 114mb  A-V:0.000 [544:0]
Pos:  17.7s    531f ( 1%) 137.46fps Trem:   6min 114mb  A-V:0.000 [546:0]
Pos:  17.7s    532f ( 1%) 137.29fps Trem:   6min 114mb  A-V:0.000 [546:0]

parfait smile

Ensuite je vais faire une expression reguliere pour recupérer les infos (par contre je ne sais pas du tout comment ca marche les expressions reguliere en python, je vais regarder ca)

Question: est ce dans la boulcle je met a jour ma GUI (qui utilise wxPython), est ce que je vais avoir des probleme? Elle va bien se mettre a jour en temps reel? ou est ce qu'il va falloir que j'utilise des fonctions (que je ne connais pas encore smile )

merci a toi encore une fois kaer.


Edit: bon en fait je viens d'essayer, et en effet, c'est "bloquant"

Quand je clic sur mon bouton start encoding, le GUI est gelé... Sinon ca aurait été trop facile smile
Qu'est ce que je peux y faire?

Dernière modification par atlas2003 (Le 05/02/2008, à 02:08)


Blabla autour d'Ubuntu > http://back2web.com/blabla/

Hors ligne

#10 Le 05/02/2008, à 09:23

aleph

Re : Question python

> atlas2003

> ... est ce que je vais avoir des probleme? ...
Oui.

> ... le GUI est gelé...
C'est tout à  fait normal.
En gros, la boucle de gestion des événements que l'interface doit gérer - app.mainloop() - à  "une sorte de priorité" sur les boucles des tà¢ches que tu fais exécuter par Python, même si celui-ci sert à  démarrer un "processus externe".
Autrement dit, ce n'est pas au moteur Python d'envoyer ses flux de sortie à  l'interface graphique, c'est à  l'interface graphique d'aller chercher les flux de sortie émis par Python. Pour ce faire, c'est l'interface graphique qui va lancer le processus.

> Qu'est ce que je peux y faire?
Jeter un oeil à  la demo de wxPython, wxPython Demos > Process and Events >  Process.

Je n'utilise pas trop ces ouitls et mon expérience est ici assez limitée, si ce n'est les quelques essais que j'ai effectué de temps à  autre. Je viens toutefois de retester via la démo en lançant un processus

python -u data/echo.py

dont le script echo.py effecute un

...
for i in range(10):
    sys.stdout.write('bla bla bla ' + str(i) + os.linesep)

...
qui m'affiche dans un wxTextCtrl

bla bla bla 0
bla bla bla 1
bla bla bla 2
bla bla bla 3
bla bla bla 4
bla bla bla 5
bla bla bla 6
bla bla bla 7
bla bla bla 8
bla bla bla 9

sans problème sous Windows 2000 + sp4, Python 2.5.1, wxPython 2.8.7.1-ansi. Il  devrait en être de même sous les autres plateformes.

Si tu as des problèmes ou autres questions, le mieux est de venir ici
http://lists.wxwidgets.org/ - list wxPython-users plutà´t que de perdre ton temps sur la toile.
( L'anglais petit nègre est très bien accecpté. )

#11 Le 05/02/2008, à 10:52

aleph

Re : Question python

> atlas2003

Je n'ai pas fait attention à  cette remarque :

"Ensuite je vais faire une expression reguliere pour recupérer les infos (par contre je ne sais pas du tout comment ca marche les expressions reguliere en python, je vais regarder ca)"

Avec Python et wxPython : http://spinecho.ze.cx/ > regulex

#12 Le 05/02/2008, à 13:33

atlas2003

Re : Question python

Parfait!
Je n'avais pas vu que dans la demo de wxPython, il y  avait des exemples concernant les process.

Merci pour le lien des expression reguliere aussi.
Je vais essayer ca des que j'ai un peu de temps et je ferais un petit compte rendu smile


Blabla autour d'Ubuntu > http://back2web.com/blabla/

Hors ligne