(Courriels de diversion: <enerve@heriterions-vanter.com> <souillures@empresserai-recueillirent.com> <inspecterent@negocies-lunaire.com> <decuver@fastueux-militaient.com> <resisteras@faconnier-exponentielles.com> <antagoniste@implorerent-consisteriez.com> <admissibilites@commotionne-appuyait.com> <cuisinerez@depreciatifs-totalitaires.com> <deposeras@integrales-hoteliere.com> <equatoriales@insurgeras-parfaire.com> )
Jean-Marc Mongrelet a écrit : > Bonjour, > > J'ai un problème Python à résoudre... > J'exécute un programme externe à mon script Python, avec la commande > os.popen, et je souhaiterais que la commande me rende le main avant que > le programme externe ne soit terminé. > > Avec os.popen, je ne sais pas du tout maitriser ça (c'est un coup oui, > un coup non... je sais pas pourquoi) > Je teste subprocess.Popen, mais pour le moment, je sèche sur la solution. > J'ai vu qu'il exister une commande os.wait... j'ai pas trop compris à > quoi elle sert. > > Quelqu'un pourrait-il m'aiguiller pour la maitrise du bloquant/non > bloquant ? > > Merci, > > JM > Tel que je le comprends, rien ne garanti que la prochaine instruction python ne soit exécutée avant que le processus lancé ne soit terminé. Il me semble que l'exemple suivant (que j'avais écrit en 2008) correspond au besoin: stdoutFile = file(cheminResultats + "/stdout", "w" ) stderrFile = file(cheminResultats + "/stderr", "w" ) cmd = '' env_val = None if os.name == 'nt': env_val={"PERL5LIB": str( x ) } cmd = str( y + '/bin/perl.exe ' + " " + z + 'file.pl ' + ' '.join ( ('--option1=truc' , "--option2" , "--dir=" + cheminResultats ) ) ) elif os.name == 'posix': cmd = str( '/usr/bin/perl' + " " + z + 'file.pl ' + ' '.join ( ('--option1=truc' , "--option2" , "--dir=" + cheminResultats ) ) ) print cmd p = subprocess.Popen( cmd , env=env_val, shell=True, stdout=stdoutFile, stderr=stderrFile ) sts= None pid = p.pid self.set_last_application_pid( str(pid) ) self.perlProcess = p p.poll() startTime = time.time() lastTime = startTime while p.returncode is None: currentTime = time.time() if (currentTime - lastTime > 1): self.updateTime(currentTime-startTime) lastTime = currentTime QtGui.qApp.processEvents() time.sleep(1) p.poll() QtGui.qApp.processEvents() returncode = p.returncode En bref: subprocess.Popen lance le processus p.returncode is None indique que le processus n'est pas terminé p.poll() j'ai oublié, mais cela me semblait nécessaire: met sans doute à jour p.returncode p.returncode contient le code de retour du processus Les flux stdout et stderr sont redirigés dans des fichiers. ----------------------------------------------------------------- Les listes de diffusion du CULTe - Pour une informatique libre http://www.CULTe.org/listes/ Pour se desabonner: mailto:linux-31-unsubscribe@CULTe.org?subject=Cliquez_sur_ENVOYER