(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