首页 > 解决方案 > 如何在 Python 中终止线程子进程调用和线程退出?

问题描述

我正在尝试在 Python 的线程中运行子进程 Popen。Popen 中的命令预计会连续运行以收集日志。但是当在线程外满足条件时,我想停止 Popen 子进程并且相应的线程也完成。下面是一个示例代表代码:

import threading
import subprocess

class MyClass(threading.Thread):
    def __init__(self):
        super(MyClass, self).__init__()
    
    def run(self):
        self.proc = subprocess.Popen("while true; do foo; sleep 2; done", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = self.proc.communicate()
            
myclass = MyClass()
myclass.start()

myclass.proc.kill()



print("Done")

但是在上面的代码中,它永远卡住了。停止正在运行的 Popen 子进程并完成线程的正确方法是什么?

标签: pythonmultithreadingsubprocess

解决方案


将参数添加 preexec_fn=os.setsid到您的Popen函数中。

用于os.killpg(proc.pid, signal.SIGKILL)通过 pid 杀死子进程。


推荐阅读