begin process at 2012 05 25 06:56:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Python

 > 

Divers

 > 

Débutant(e)

 > 

subprocess.Ppen et GTK


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

subprocess.Ppen et GTK

dimanche 10 janvier 2010 à 22:50:28 | subprocess.Ppen et GTK

pyben

Bonsoir

Je suis sous ubuntu 9.10. J'essaye de créer une interface graphique en pyGtk pour Mencoder afin de convertir des vidéos lisible par mon lecteur mp4. Après avoir récupéré le nom des fichiers source, cible et les paramètres de qualité et de format, je construis une commande shell que je lance via subprocess.Popen. Mon programme fonctionne mais je butte sur deux problèmes qui viennent probablement de ma méconnaissance de subprocess :
- J'ai tenté de créer une fonction stop() tuant le processus mais elle en fonctionne pas.
- Je voudrais incrémenter une barre de progression en fonction de l'avancée de l'encodage. J'ai essayé de récupérer la sortie de Mencoder via communicate() mais lorsque je tube les sorties, l'application graphique se fige,donc impossible de traiter quelque information que ce soit. Par ailleurs, lorsque je récupère les sorties, les lignes contenant l'état d'avancement de l'encodage n'apparaissent pas.
Voilà la partie où ce situe le problème.
Code Python :
#!/usr/bin/python
# -*- Encoding: Latin-1 -*-
class encodage_start(gtk.HBox):
	"Cette classe créer une zone contenant un bouton pour lacer l'encodage et une barre de progression qui pulsera grace à la methode pulsate. Elle recoit en argument les 2 objets fichiers et video contenant les nom des fichiers et les parametres d'encodage"
	def __init__(self,fichiers,video):
		gtk.HBox.__init__(self,False,2)
		self.fichiers=fichiers
		self.video=video
		self.button_encoder = gtk.Button("Convertir...",stock=gtk.STOCK_CONVERT)
		#Fix me On créer un bouton stop qui ne fonctionne pas pour l'instant
		self.button_stop = gtk.Button("Stop",stock=gtk.STOCK_STOP)
		self.pack_start(self.button_encoder, False, True, 0)
		self.barre=gtk.ProgressBar(adjustment=None)
		self.pack_end(self.barre,True,True,0)
		self.pack_end(self.button_stop,False,True,0)
		self.button_encoder.connect("clicked", self.OnButton_encoder)
		self.button_stop.connect("clicked",self.OnButton_stop)

	def OnButton_encoder(self,widget):
		#On instancie un objet à partir de la classe encodeur qui va lancer mencodeur. On récupère les nom de fichiers grace aux methode get_name() et get_parameters() des objet fichiers et video
		self.encodage = encodeur(self.fichiers.get_name(),self.video.get_parameters())		
		#L'objet encodeur lance mencodeur grace à subprocess.Popen. On lance donc la methode pulsate toutes les 100 ms pour faire defiler la barre de progression.
		#fix me Trouver une solution pour faire une veritable barre de progression qui indiquerait l'état d'avancement de l'encodage.
		# Lors d'essai avec la récuperation des sorties standard de mencoder grace à la methode communicate(), la barre ne pulse plus.
		timer = gobject.timeout_add (100, self.pulsate)
		
	def OnButton_stop(self,widget):
		#lance la methode stop de l'objet encodage. Ne fonctionne pas !
		self.encodage.stop()
		
	def pulsate(self):
		#la methode poll est une sorte de recopie de la methode Popen.poll().Tant qu'elle ne renvoit rien, on fait pulser la barre
			while self.encodage.poll() is None:
				self.barre.set_text("Encodage en cours, patientez ...")
				self.barre.pulse()
				return True
		#Dès qu'elle renvoit une valeur, c'est que le processus lancé par popen est terminé. Si le returncode est 0, tout va bien c'est terminé
			if self.encodage.poll() == 0:
				self.barre.set_fraction(1)
				self.barre.set_text("Terminé")
				return False
			#Sinon la fonction renvoit la sortie de mencoder. Celle ci s'affiche dans une boite de message instancié à partir de l'objet BoiteDialogue. 
			else:
				erreur = BoiteDialogue("Erreur lors de l'execution de Mencoder !\n\n\n"+self.encodage.poll())


class encodeur:
	"Cette classe lance mencoder à partir de subprocess.Popen. La commande shell est construite en récuperant d'une part les nom de fichiers sources et cible renvoyée par le gui et les parametre sont récupérés dans un fichier .ini lisible par ConfigParser"
	def __init__(self,fichiers,parametres):
		self.fichiers=fichiers
		self.parametres=parametres
		self.message=""
		ini=ConfigParser.ConfigParser()
		ini.read(fichier_ini)
		param=ini.get("Qualite",self.parametres[0])+"-"+ini.get("Resolution",self.parametres[1])+"-"+ini.get("Echelle",self.parametres[2])
		parametres=ini.get("parametre",param)
		self.commande_shell = "mencoder "+self.fichiers[0]+" "+parametres+" -o "+self.fichiers[1]
		self.retour = subprocess.Popen(self.commande_shell, shell=True)
		
		
	def poll(self):
		#Cette fonction est proche de subprocess.Popen.poll()
		while self.retour.poll() is None:
			return None
		#Impossible d'avoir un returncode 1 avec try: subprocess.popen(mencoder) en cas d'erreur lors de l'encodage.
		#De plus, lorsque on tube les sorties standard et erreur, on arrive plus a faire pulser la barre de progression.
		#On a donc recreer une structure try else en utilisant la methode wait() de subprocess.Popen
		#Si le returncode est 0, on retourne 0
		if self.retour.wait() == 0:
			return 0
		#Sinon, on refait tourner le programme en ouvrant des tubes pour récupere le message revoyé par mencoder
                # pour une fenere de dialogue permettant de debuger
		else :
			self.retour = subprocess.Popen(self.commande_shell, stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True)
			self.message= self.retour.communicate()[0]
			return self.message
			
	def stop(self):
		#Cette methode n'arrête pas le processus.
		print "stop"
		self.retour.kill()
	


Voilà, si quelqu'un (ou quelques uns) peuvent éclairer ma lanterne, je lui (ou leur) en saurais fort gré
Si quelqu'un est intéressé par ce qui marche déjà, je suis tout disposé à le transmettre.

Merci d'avance


Cette discussion est classée dans : fichiers, self, stop, encodage, subprocess


Répondre à ce message

Sujets en rapport avec ce message

wxWindow::RegisterHotKey [ par DoudouBidou ] Bonjour à tous(au passage Merci pour ce site, depuis le temps que je l'attends...)J'utilise wxPython pour réaliser mon interface graphique mais je n'a heklp serverSocket [ par Harvester_ ] Voila j'ai utliser un script du siteC'est un server socket qui marchait tres bien au debut(source)#!C:\Python23\python.exeimport SocketServerimport sy Socket : charger ip depuis fichier [ par Shinji ] Bonjour @ ttes et @ ts, voici mon pb:  j'essaye de faire une petite app client/serveur et j'aimerais pouvoir enregister l'ip/port du serveur dans un IDLE : une mauvaise plaisanterie ? [ par steede ] Bonjour, je débute la programmation (enfin je m'y remets...et je suis autodidacte) et j'ai d'énormes problèmes  avec Python à savoir :   - toutes les Comment lancer son application !!!!!!!!!! [ par steede ] Voila, j'ai écrit (pompé) une malheureuse app (extraite d'un exemple "simple" de wx) et j'aimerais la faire fonctionner !!!!ci dessous la ligne de la encodage des caractères [ par taz_iup ] J'aimerai que quelque'un fasse un peu de lumiere sur ce monde obscur de l'encodage des caratères..... ex de code. def ma fonction( self, repertoire Il me manque une librairie [ par cipher16 ] Bonjour ... je viens de commencer à coder en python ... et il semblerai qu'il me manque une librairie ayant un rapport avec internet ... J'ai cherché Fichiers en python [ par darfeuille ] Salut,   Etant novice en python, je bloque sur un truc :   Dans un de mes programmes, a un moment, je dois recopier un fichier (en le modifiant) d'u Date de création des fichiers par ftp [ par judre ] Salut, J'ai une application qui transfère une tonne de fichier par ftp en utilisant ftplib.  J'aimerais savoir si y'a un truc pour télécharger les fi instruction de base sous Python de transfert de fichiers [ par dgpgl ] Comment transferer des fichiers par xxx.jpeg depuis un PC windows sur une  machine linux... a l'adresse xxx.ccc.com qui est ouverte via un port ssh! a


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales