如何中断正在运行bash命令的python脚本?

How to interrupt python script that is running a bash command?

提问人:user56834 提问时间:11/16/2023 更新时间:11/16/2023 访问量:70

问:

我正在运行一个 python 脚本,该脚本通过cmd

try:
    subprocess.run(['/bin/bash', '-ic', cmd])
except as e:
    print("Error:", e)

我从 bash 终端运行这个 python 脚本。当我在执行某些 bash 命令时按下时,似乎只有 bash 命令被打断,但 python 脚本继续运行(没有捕获和打印异常。如何让 cntrl-C 或其他一些终端命令中断或导致 python 本身出现异常?cntrl-Ce

python linux bash

评论

0赞 KamilCuk 11/16/2023
你读过文档吗?它列出了哪些参数?您阅读了模块文档吗?还有什么其他功能?可能有人对你有启发吗?subprocess.runsubprocess
0赞 Elvin Jafarov 11/16/2023
这回答了你的问题吗?如何终止使用 shell=True 启动的 python 子进程
0赞 user1934428 11/16/2023
如果无法创建子进程,我希望触发异常。尝试用一些不存在的命令替换 tor。我想你会看到错误/bin/bash
0赞 user1934428 11/16/2023
至于你的问题,你可以测试你的命令的退出代码。如果为 130,则命令被 control-C 中止。

答:

2赞 Kais 11/16/2023 #1

Python 脚本不会接收到信号,因为它将 shell 作为子进程运行。

若要在 Python 脚本中处理 Ctrl-C 并捕获 KeyboardInterrupt 异常,可以使用 signal 模块:

import subprocess
import signal

def signal_handler(sig, frame):
    raise KeyboardInterrupt("Ctrl-C pressed")

# Register the signal handler
signal.signal(signal.SIGINT, signal_handler)

cmd = "add_command_here"

try:
    subprocess.run(['/bin/bash', '-ic', cmd])
except Exception as e:
    print("Error:", e)

评论

0赞 user56834 11/17/2023
是否将信号的触发注册到所有子进程?我很困惑,因为如果 python 脚本根本没有接收到信号,那么如何接收 SIGINT?signal.signal(signal.SIGINT, signal_handler)signal_handlersignal