Python脚本未随键盘中断而退出

问题描述

我制作了一个简单的脚本来捕获屏幕截图,并每隔几秒钟将其保存到一个文件中。 这是脚本:

from PIL import ImageGrab as ig
import time
from datetime import datetime

try :
    while (1) :
        tm = datetime.today().strftime('%Y-%m-%d-%H:%M:%s')
        try :
            im = ig.grab()
            im.save('/home/user/tmp/' + tm + '.png')
            time.sleep(40)
        except :
            pass
except KeyboardInterrupt:
    print("Process interrupted")
    try :
        exit(0)
    except SystemExit:
        os._exit(0)
        

它可以完美工作(在Ubuntu 18.04,python3中),但是键盘中断不起作用。我关注了this问题,并添加except KeyboardInterrupt:语句。当我按CTRL+C时,它将再次截取屏幕截图。有人可以帮忙吗?

解决方法

您需要将键盘中断异常处理一次。键盘中断永远不会到达您的外部try / except块。

您要转义while循环,则在while块中处理异常:

while True: # had to fix that,sorry :)
    tm = datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
    try :
        im = ig.grab()
        im.save('/home/user/tmp/' + tm + '.png')
        time.sleep(40)
    except :   # need to catch keyboard interrupts here and break from the loop
        pass

如果您在键盘中断中从循环中中断,则会退出while循环,而不会再次抓住。

,

使用以下代码解决您的问题:

from PIL import ImageGrab as ig
import time
from datetime import datetime

while (1):
    tm = datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
    try:
        im = ig.grab()
        im.save('/home/user/tmp/' + tm + '.png')
        time.sleep(40)
    except KeyboardInterrupt: # Breaking here so the program can end
        break
    except:
        pass

print("Process interrupted")
try:
    exit(0)
except SystemExit:
    os._exit(0)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...