我试图在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中有一个很好的方法吗?
答案 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?。