如何杀死在线程中启动的子进程?

时间:2016-06-07 22:53:58

标签: python windows multithreading python-3.x subprocess

我试图在Windows中运行Python的Robocopy命令(但我对任何子进程很好奇)。代码非常简单,运行良好。它是:

def copy():
    with Popen(['Robocopy', media_path, destination_path, '/E', '/mir', '/TEE', '/log+:' + log_path], stdout=PIPE, bufsize=1, universal_newlines=True) as Robocopy:
        Robocopy.wait()
        returncode = Robocopy.returncode

此外,我在一个单独的线程中运行它,其中包含以下内容:

threading.Thread(target=copy, args=(media_path, destination_path, log_path,), daemon=True)

但是,在某些情况下,我想停止robocopy(如果从命令行运行,则类似于关闭CMD窗口)

在Python中有一个很好的方法吗?

2 个答案:

答案 0 :(得分:1)

我们在Windows上可靠地杀死子进程并进行了一段时间的战斗,最终遇到了这个问题:

https://github.com/andreisavu/python-process/blob/master/killableprocess.py

它实现了一个用于查杀子进程的kill()方法。我们已经取得了非常好的成绩。

您需要以某种方式将进程对象从线程中传出并从另一个线程调用kill(),或使用超时在wait()的线程中轮询,同时监视某种global-ish标志

答案 1 :(得分:1)

如果流程没有启动其他流程,则process.kill()应该有效:

import subprocess

class InterruptableProcess:
     def __init__(self, *args):
         self._process = subprocess.Popen(args)

     def interrupt(self):
         self._process.kill()

我不明白为什么你需要在Windows上使用它,但如果你愿意,可以运行Thread(target=self._process.wait, daemon=True).start()

如果进程有可能依次启动其他进程,那么您可能需要 Job对象来终止所有后代进程。似乎killableprocess.py suggested by @rrauenza使用了这种方法(我没有测试过它)。请参阅Python: how to kill child process(es) when parent dies?