我在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,一直跳出批处理文件或其他方式?
答案 0 :(得分:1)
在批处理文件中使用break
(More 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"