Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
LINUX & OPEN SOURCE
6 juin 2009

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)
  ...
  ...



Publicité
Publicité
Commentaires
LINUX & OPEN SOURCE
Publicité
Archives
Publicité