Python 3通过发送Ctrl C停止子进程

时间:2019-08-22 11:11:18

标签: python python-3.x linux gpu

我有一些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发送给子进程,就像用户键入了它一样?

**更新

import subprocess


def start(executable_file):
    return subprocess.Popen(
        executable_file,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )


def read(process):
    return process.stdout.readline().decode("utf-8").strip()


def write(process):
    process.stdin.write('\x03'.encode())
    process.stdin.flush()

def terminate(process):
    process.stdin.close()
    process.terminate()
    process.wait(timeout=0.2)


process = start("./test.sh")
write(process)
for x in range(100):
    print(read(process))
terminate(process)

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

2 个答案:

答案 0 :(得分:1)

我认为您可能可以使用以下内容:

import signal
try:
    p=subprocess...
except KeyboardInterrupt:
    p.send_signal(signal.SIGINT)

答案 1 :(得分:1)

以下解决方案是我发现的唯一适用于 windows 的解决方案,并且与发送 Ctrl + C 事件最相似。

import signal
os.kill(self.p.pid, signal.CTRL_C_EVENT)