我有一些GPU测试软件,我正在尝试使用python3进行自动化,该测试通常会运行3分钟,然后由用户使用ctrl + c取消,并生成以下输出
使用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命令只是发送一个空字符,而不会结束脚本
答案 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)