如何正确处理SIGINT以关闭文件/连接

达达拉斯神话

我想在脚本中实现正确的SIGINT处理,该脚本将打开多个文件和一个数据库连接。如果脚本是CTRL + C或其他方式中断,则应将其关闭。

以前,我使用KeyboardInterrupt异常捕获CTRL + C,在那儿我检查是否定义了文件/连接,如果如此,则关闭它们,然后退出。

这是否真的是pythonic的方式,还是建议使用信号处理程序?例如

import signal, sys, time

def handler(signum, frame):
    print("..kthxbye")
    sys.exit(1)

def main():
    signal.signal(signal.SIGINT, handler)
    i = 0
    while True:
        print(i)
        i += 1
        time.sleep(1)

if __name__ == "__main__":
    main()

对我来说似乎比较干净,但是我不知道如何将文件名或数据库连接传递给处理程序。

Pasztorpisti

我宁愿KeyboardInterrupt在主线程上捕获异常。KeyboardInterruptSIGINTpython默认处理程序的结果直接KeyboardInterrupt捕获时相比,异常的异常处理程序是一个更安全/友好的上下文SIGINT

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        cleanup()

编辑:这是如何在两种方法之间共享变量(状态):

程序:

import sys, time

class SharedState:
    def __init__(self):
        self.var0 = 42
        self.var1 = 'string'

# method 1
shared_variable = 'woof woof'

# method 2: avoiding global declarations in functions
shared_state = SharedState()

def main():
    # In order to write a global variable you need a global
    # declaration otherwise the assignment would create a
    # local variable

    global shared_variable
    shared_variable = 5

    shared_state.var0 = 10

    time.sleep(10)

def cleanup():
    print shared_variable
    print shared_state.var0
    sys.exit(1)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        cleanup()

面向对象(我的偏爱):

import sys, time

# method 3: object oriented programming
class Program:
    def __init__(self):
        self.var0 = 42
        self.var1 = 'string'

    def main(self):
        self.var0 = 5
        self.var1 = 'woof woof'
        time.sleep(10)

    def cleanup(self):
        # both main and cleanup can access the member
        # variables of this class
        print self.var0
        print self.var1
        sys.exit(1)

    def execute(self):
        try:
            self.main()
        except KeyboardInterrupt:
            self.cleanup()

if __name__ == '__main__':
    Program().execute()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确处理Visual Studio关闭?

来自分类Dev

关闭控制台时如何正确处理SIGBREAK?

来自分类Dev

Xpages和OrientDB-如何正确处理连接对象?

来自分类Dev

如何正确处理ZeroMQ.js中的连接超时?

来自分类Dev

Xpages和OrientDB-如何正确处理连接对象?

来自分类Dev

如何正确处理掉卷曲的掉线连接

来自分类Dev

如何正确处理多个特权MySQL连接帐户

来自分类Dev

正确处理responseStream和StreamReader关闭

来自分类Dev

客户端无需关闭握手即可与websocket断开连接(关闭浏览器选项卡)。如何正确处理呢?

来自分类Dev

如何在Python中正确处理Logger文件大小?

来自分类Dev

如何在Python中正确处理Logger文件大小?

来自分类Dev

如何在MAC OSX上正确处理.ics文件?

来自分类Dev

如何正确处理JSON文件中的更改?

来自分类Dev

如何用汇编语言正确处理文件

来自分类Dev

如何正确处理httpClient?

来自分类Dev

如何正确处理scanf()

来自分类Dev

如何正确处理并发?

来自分类Dev

如何正确处理导航

来自分类Dev

如何正确处理插件,确保所有打开的服务调用均已关闭

来自分类Dev

PHP脚本无法从MySQL数据正确生成KML文件-如何正确处理此问题?

来自分类Dev

在C#中处理文件时如何正确处理异常

来自分类Dev

Flask下的fork如何正确处理?

来自分类Dev

OCaml:如何正确处理总和类型?

来自分类Dev

如何正确处理请求承诺错误?

来自分类Dev

如何正确处理AsyncTasks的RejectedExecutionException?

来自分类Dev

AngularJS-如何正确处理承诺

来自分类Dev

如何正确处理异步并发请求?

来自分类Dev

如何正确处理SSLSocketImpl死锁?

来自分类Dev

如何正确处理标头中的异常?

Related 相关文章

热门标签

归档