Python3通过发送Ctrl C停止子进程

2024-06-02 20:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些GPU测试软件,我正在尝试使用python3自动执行,测试通常运行3分钟,然后由用户使用ctrl+c取消,生成以下输出

GPU test output

使用ctrl+c退出后,可以再次运行测试,而不会出现任何问题

当尝试用popen子进程来实现自动化,并发送SIGINT或SIGTERM时,我得到的结果与使用键盘输入不同。脚本突然退出,在随后的运行中找不到gpu(假设它没有正确卸载驱动程序)

from subprocess import Popen, PIPE
from signal import SIGINT
from time import time


def check_subproc_alive(subproc):
    return subproc.poll() is None

def print_subproc(subproc, timer=True):
    start_time = time()
    while check_subproc_alive(subproc):
        line = subproc.stdout.readline().decode('utf-8')
        print(line, end="")
        if timer and (time() - start_time) > 10:
            break


subproc = Popen(['./gpu_test.sh', '-t', '1'], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False)

print_subproc(subproc)

subproc.send_signal(SIGINT)

print_subproc(subproc, False)

如何将ctrl+c发送到子流程,就像用户键入它一样?在

**更新

^{pr2}$

尝试了上面的代码,可以让字符注册到伪sh脚本中,但是发送\x03命令只会发送一个空字符,而不会结束脚本


Tags: 用户fromimport脚本signalgputimedef