python教程—在程序关闭期间捕获Python中的KeyboardInterrupt-Python实用宝典

python教程—在程序关闭期间捕获Python中的KeyboardInterrupt

我正在用Python编写一个命令行实用程序,由于它是生产代码,应该能够干净地关闭,而不会向屏幕转储一堆东西(错误代码、堆栈跟踪等)。这意味着我需要捕捉键盘中断。

我正在用Python编写一个命令行实用程序,由于它是生产代码,应该能够干净地关闭,而不会向屏幕转储一堆东西(错误代码、堆栈跟踪等)。这意味着我需要捕捉键盘中断。

我已经尝试使用两个try catch块,比如:

    if __name__ == '__main__': try: main() except KeyboardInterrupt: print 'Interrupted' sys.exit(0)

和捕捉信号本身(如这篇文章):

    import signal import sys def sigint_handler(signal, frame): print 'Interrupted' sys.exit(0) signal.signal(signal.SIGINT, sigint_handler)

这两种方法在正常操作中似乎都很有效。然而,如果中断发生在应用程序末尾的清理代码期间,Python似乎总是会向屏幕输出一些东西。捕捉中断会给出

^CInterrupted
Exception KeyboardInterrupt in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802852b90>> ignored

而处理信号则给出两者之一

^CInterrupted
Exception SystemExit: 0 in <Finalize object, dead> ignored

^CInterrupted
Exception SystemExit: 0 in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802854a90>> ignored

这些错误不仅难看,而且没有多大帮助(特别是对于没有源代码的最终用户)!

这个应用程序的清理代码相当大,所以这个问题很有可能会被实际用户发现。有什么方法可以捕获或阻止这个输出,还是我必须处理它?

回答

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论