停止 KeyboardInterrupt 到达批处理文件处理器

Stop KeyboardInterrupt reaching batch file processor

我正在 Windows 上的 Python 3 中编写一些代码,如下所示:

try:
    do something that takes a long time
    (training a neural network in TensorFlow, as it happens)
except KeyboardInterrupt:
    print('^C')
print a summary of results
still useful even if the training was cut short early

如果 运行 直接从控制台使用 python foo.py.

,这将完美运行

但是,如果对 Python 的调用是在批处理文件中进行的,它最终会执行上述所有操作,但仍然会向控制台发送垃圾邮件 'terminate batch job' 提示符。

有没有办法阻止这种情况发生?通过完全吃掉 Python 中的 ^C,完全跳出批处理文件或其他方式?

在批处理文件中使用 break (More info here) 命令,这将禁用 CTRL+C 暂停文件

编辑: 根据 break 命令的 this site

Newer versions of Windows (Windows ME, Windows 2000, Windows XP, and higher) only include this command for backward compatibility and turning the break off has no effect.

我亲自测试了这个,可以确认,当我找到解决方法时我会编辑

编辑 #2: 如果你可以运行第二个批处理脚本 start "" /b /wait cmd /c "yourfile.bat" 虽然,这已知会导致其他嵌套批处理文件出现故障

禁用 Ctrl+C 的标志由子进程继承,因此 Python 将不再引发 KeyboardInterrupt。另外,如果从控制台读取被 Ctrl+C 中断而没有从 CRT 获得 SIGINT,我们在 Python 中仍然存在错误。 Python 脚本应该通过 ctypes 手动启用 Ctrl+C。使用导入 ctypes; kernel32 = ctypes.WinDLL('kernel32', use_last_error=真);成功 = kernel32.SetConsoleCtrlHandler(None, 假)

EDIT #3 正如 Eryksyn 所指出的(在评论中),您可以使用 cytpesENABLE 它;

import ctypes; 
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True); success = kernel32.SetConsoleCtrlHandler(None, False)

编辑 #4: 我想我找到了,试试这个(虽然它可能不起作用)你可以使用 threading 导入吗?

import time
from threading import Thread

def noInterrupt():
    for i in xrange(4):
        print i
        time.sleep(1)

a = Thread(target=noInterrupt)
a.start()
a.join()
print "done"