Lancer un sous-programme et récuperer le pid pour le tuer!
C'est un problème banal: Lancer un programme à partir du script python et le tuer un peu plus tard. Cela m'a fait passer quelques heures pour trouver une solution correcte.
Voici la méthode que j'utilise dans jpegemail pour lancer une pseudo barre de progression (le programme a été écrit en c) et la tuer après un moment.
import os,popen2
...
#Not a real progress bar but help to wait
cmdpid=0
try:
#cmd in a sequence [...,...,...] the shell is not called, get the pid of the subprocess
cmdpid=popen2.Popen3([jpegemail_prog+'progressbar','-l='+repr(length),'-m=" Upload files in progress "']).pid
except:
print 'No progress bar\n'
print "PID progessbar",cmdpid
...
#Kill the progressbar
if cmdpid: os.kill(cmdpid,9)
L'instruction popen2.Popen3([sub_process,arg1,arg2,...]).pid lance le sous-programme avec sa liste d'arguments et retourne le pid du sous-programme. Il est important d'utiliser une séquence [prog,arg1,arg2,arg3,...] et non pas une simple chaine de caractères, sinon le programme est lancé avec le shell et on obtient uniquement le pid du shell.
L'instruction os.kill(cmdpid,9) se charge de tuer le programme.
Remarque: Aussitôt que le sous-programme est lancé, le programme principal python continue ses instructions. Si on souhaite attendre que le sous-programme se termine avant de passer à la suite des instructions, il faut ajouter l'instruction: os.waitpid(cmdpid,0)
Par exemple:
import os,popen2
...
cmdpid=0
try:
cmdpid=popen2.Popen3([jpegemail_prog+'progressbar','-l='+repr(length),'-m=" Upload files in progress "']).pid
except:
print 'No subprocess\n'
print "subprocess pid:",cmdpid
os.waitpid(cmdpid,0)
...
...