取消 Python 脚本时做某事[重复]

Posted

技术标签:

【中文标题】取消 Python 脚本时做某事[重复]【英文标题】:When cancelling a Python script do something [duplicate] 【发布时间】:2013-12-25 21:53:29 【问题描述】:

当我按 CTRL+C 取消正在运行的 python 脚本时,有没有办法在脚本终止之前运行某个 python 代码?

【问题讨论】:

你可以捕捉到KeyboardInterrupt错误;或者你可以设置a signal handler;或者你可以在退出时做一些事情using the atexit module。 【参考方案1】:

使用try/except 捕获KeyboardInterrupt,当您按下CTRL+C 时会引发该问题。

下面是一个基本的演示脚本:

try:
    # Main code
    while True:
        print 'hi!'
except KeyboardInterrupt:
    # Cleanup/exiting code
    print 'done!'

这将持续打印'hi!',直到您按下CTRL+C。然后,它打印'done!' 并退出。

【讨论】:

【参考方案2】:

CTRL+C 引发KeyboardInterrupt。您可以像任何其他异常一样捕获它:

try:
    main()
except KeyboardInterrupt:
    cleanup()

如果你真的不喜欢这样,你也可以使用atexit.register 来注册清理操作以运行(前提是你没有做一些非常讨厌的事情并导致解释器以一种时髦的方式退出)

【讨论】:

atexit.register 是一个很好的选择。【参考方案3】:
try:
    # something
except KeyboardInterrupt:
    # your code after ctrl+c

【讨论】:

【参考方案4】:

我很确定你只需要一个 try/finally 块。

试试这个脚本:

import time

def main():
    try:
        while True:
            print("blah blah")
            time.sleep(5)
    except KeyboardInterrupt:
        print("caught CTRL-C")
    finally:
        print("do cleanup")

if __name__ == '__main__':
    main()

输出应该是这样的:

blah blah
caught CTRL-C
do cleanup

【讨论】:

【参考方案5】:

这段代码

import time 

try:
    while True:
        time.sleep(2)
except KeyboardInterrupt:
    print "Any clean"

给予

deck@crunch ~/tmp $ python test.py 
^CAny clean

当我在执行时按Ctrl+C。 你只需要处理KeyboardInterrupt 异常。

您也可以处理signals 来设置处理程序。

【讨论】:

以上是关于取消 Python 脚本时做某事[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果 AJAX 错误,请取消选中复选框 [重复]

当一个动作被派发时做某事

Android:当电池电量处于定义水平时做某事

当计算机进入“睡眠”状态时做某事

如何取消python中运行脚本时 run in unittest

vim评论/取消评论与一个映射[重复]