python子进程没有终止

时间:2017-09-29 07:30:11

标签: python subprocess termination

要在一组文件上执行各种工具,我使用以下Command类来调用它们。

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

我面临的问题是:

  • 我运行的工具/命令没有正确终止,特别是如果python程序运行时间很长(3个多小时)。

1 个答案:

答案 0 :(得分:0)

问题是你用shell = True

打开进程
self.process = subprocess.Popen(self.cmd, shell=True, stdout=logfile)

此处的解决方案:How to terminate a python subprocess launched with shell=True