如何将 Ctrl+C 传递给批处理作业调用的脚本

如何将 Ctrl+C 传递给批处理作业调用的脚本

我试图避免按下Ctrl+C批处理文件的影响,类似于如何抑制“终止批处理作业(Y/N)”确认?。但是,就我而言,我希望信号由我的底层脚本处理。我的批处理文件如下所示:

@ECHO off
setlocal
set "script_path=%~dp0"
set "script_path=%script_path%myscript.py"
python "%script_path%" %*
endlocal

我希望能够按下 Ctrl+C 并将其作为KeyboardInterrupt错误处理,myscript.py而不是立即终止进程。现在,如果我按下Ctrl+C,我会得到:

forrtl: error (200): program aborting due to control-C event
Image              PC        Routine            Line        Source
libifcoremd.dll    0FCA7CB8  Unknown               Unknown  Unknown
KERNELBASE.dll     76411C99  Unknown               Unknown  Unknown
KERNEL32.DLL       74A68484  Unknown               Unknown  Unknown
ntdll.dll          77C2305A  Unknown               Unknown  Unknown
ntdll.dll          77C2302A  Unknown               Unknown  Unknown
Terminate batch job (Y/N)?

我尝试过以下选项:

  1. 替换python "%script_path%" %*start python "%script_path%" %*。这将启动一个新的 shell,这实际上对我想要做的事情很有帮助。标准输入似乎在新 shell 中正常工作。但是,Ctrl+C效果与之前相同,新 shell 立即死机。将exit命令附加到批处理文件末尾似乎也没有效果。
  2. 替换python "%script_path%" %*start /b python "%script_path%" %*。这只会在同一个 shell 中在后台启动该作业。Ctrl+C仍然只是终止该作业,现在标准输入似乎无法正常工作。

补充说明:

我的 Python 脚本确实需要偶尔读取用户输入sys.stdin。脚本读取一些输入,然后以允许用户点击的方式处理它Ctrl+C。这样做的目的是在子句中做一些有意义的事情except KeyboardInterrupt:,而不是看着脚本死掉。

答案1

Ctrl-C这样SIGINT你就可以使用signal你的python脚本中的模块来捕获它:

import signal
import time

def handler(signum, frame):
    print 'Got Ctrl-C'
    #you code handling the Ctrl-C

signal.signal(signal.SIGINT, handler)
# your code

请记住,有一个Windows 版 Python 2.7 中的错误,标记为Won't fix,因此您应该使用 Python 3.3+。

相关内容