我试图避免按下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)?
我尝试过以下选项:
- 替换
python "%script_path%" %*
为start python "%script_path%" %*
。这将启动一个新的 shell,这实际上对我想要做的事情很有帮助。标准输入似乎在新 shell 中正常工作。但是,Ctrl+C效果与之前相同,新 shell 立即死机。将exit
命令附加到批处理文件末尾似乎也没有效果。 - 替换
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+。