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

时间:2017-12-01 19:34:00

标签: python windows batch-file windows-console

我在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的调用是在批处理文件中,它最终会执行上述所有操作,但仍然会通过“终止批处理作业”来向控制台发送垃圾邮件。提示。

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

1 个答案:

答案 0 :(得分:1)

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

编辑:根据break命令的this site

  

较新版本的Windows(Windows ME,Windows 2000,Windows XP及更高版本)仅包含此命令以实现向后兼容性,并且关闭中断无效。

我亲自对此进行了测试,并且可以确认,我会在找到解决方法后进行编辑

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

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

编辑#3 正如Eryksyn所指出的(在评论中),您可以使用cytpes 启用它;

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"