2017-09-29 13 views
0

Pour exécuter divers outils sur un ensemble de fichiers, j'utilise la classe de commande suivante pour les appeler.Les sous-processus python ne se terminent pas

import subprocess 
import threading 
import logging 
logger = logging.getLogger('root') 


class Command(object): 
    def __init__(self, cmd): 
     self.cmd = cmd 
     self.process = None 

    def run(self, timeout, logfile): 
     def target(): 
      logger.info('Thread started') 
      logger.info('Command: %s' % self.cmd) 
      if logfile is None: 
       self.process = subprocess.Popen(self.cmd, shell=True) 
      else: 
       logger.info('logging to file %s' % logfile.name) 
       self.process = subprocess.Popen(self.cmd, shell=True, stdout=logfile) 
      self.process.communicate() 
      logger.info('Thread finished') 
      self.process.kill() 
     thread = threading.Thread(target=target) 
     # make it a daemon 
     thread.daemon = True 
     thread.start() 
     thread.join(timeout) 
     if thread.is_alive(): 
      logger.warn('Terminating process') 
      thread.join() 
      self.process.kill() 
     logger.info('Thread Returncode: %d' % self.process.returncode) 
     return self.process.returncode 

Le problème que je visage est:

  • que les outils/commandes que je n'exécuter terminiez, surtout si le programme python fonctionne longues (plus de 3 heures).

Répondre