python - Python 3 通过发送 Ctrl C 停止子进程
问题描述
我有一些 GPU 测试软件,我正在尝试使用 python3 自动化,测试通常会运行 3 分钟,然后由用户使用 ctrl+c 取消,生成以下输出
使用 ctrl+c 退出后,可以再次运行测试,没有问题
当尝试使用子进程 popen 自动执行此操作并发送 SIGINT 或 SIGTERM 时,我得到的结果与使用键盘输入不同。脚本突然退出,在随后的运行中找不到 gpus(假设它没有正确卸载驱动程序)
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 命令只会发送一个空字符并且不会结束脚本
解决方案
我想你可能可以使用这样的东西:
import signal
try:
p=subprocess...
except KeyboardInterrupt:
p.send_signal(signal.SIGINT)
推荐阅读
- json - unity Json 添加和删除
- c++ - 如何在 C++ 中遍历多个都遵循类似格式的 .txt 文件?
- sql-server - 试图从变量表中返回两行的百分比
- python - 错误:无法为使用 PEP 517 且无法直接安装的 glpk 构建轮子
- c# - 选择在列表视图子项中找到的多个
- python - Pandas 更高效地合并
- twilio - 我可以向使用 twilio 的人发送带有相应位置的通知吗?
- docker - 是否有正确的方法使用 jfrog CLI 从 Artifactory 下载容器映像以进行 docker pull?
- scala - 如何将成员组标签添加到scaladoc中的参数字段或案例类字段?
- firebase - 如何暂时关闭或关闭 Firebase 网络应用?