当前位置: 首页 > 面试题库 >

如何防止代码块被Python中的KeyboardInterrupt中断?

童子明
2023-03-14
问题内容

我正在编写一个程序,通过pickle模块缓存一些结果。目前发生的情况是,如果在执行dump操作时按ctrl-c,则会dump被打断,从而导致文件损坏(即仅部分写入,因此无法load再次进行编辑)。

有没有办法使dump代码块或通常的代码块不间断?我当前的解决方法如下所示:

try:
  file = open(path, 'w')
  dump(obj, file)
  file.close()
except KeyboardInterrupt:
  file.close()
  file.open(path,'w')
  dump(obj, file)
  file.close()
  raise

如果操作被中断,重新启动该操作似乎很愚蠢,所以我正在寻找一种推迟中断的方法。我该怎么做呢?


问题答案:

函数放在线程中,然后等待线程完成。

除非使用特殊的C api,否则无法中断Python线程。

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"


0
1
2
3
Traceback (most recent call last):
  File "C:\Users\Admin\Desktop\test.py", line 11, in <module>
    a.join()
  File "C:\Python26\lib\threading.py", line 634, in join
    self.__block.wait()
  File "C:\Python26\lib\threading.py", line 237, in wait
    waiter.acquire()
KeyboardInterrupt

看看如何将中断推迟到线程完成为止?

在这里它适合您的使用:

import time
from threading import Thread

def noInterrupt(path, obj):
    try:
        file = open(path, 'w')
        dump(obj, file)
    finally:
        file.close()

a = Thread(target=noInterrupt, args=(path,obj))
a.start()
a.join()


 类似资料:
  • 问题内容: 有没有一种方法可以使类函数不可重写?类似于java的关键字。即,任何覆盖的类都不能覆盖该方法。 问题答案: 问题是您正在尝试使用Java哲学来用Python编写。有些东西会延续,但不是全部。在Python中,您可以执行以下操作,这非常好,但是完全违反了Java对对象的看法。 如果您确实需要,可以尝试此处发布的代码。但是正如您所看到的,有很多代码可以让它执行您想要的操作。还应注意,即使是

  • 问题内容: 我有点困惑,PHP中有很多函数,有些使用这个,有些使用那个。有些人使用:,,等 哪个是正确的,你们通常使用什么? 这是正确的吗(如果有的话,建议我做一个更好的): 该行可以防止MySQL注入和XSS攻击? 顺便说一句,除了XSS攻击和MySQL注入之外,还有其他需要注意的事情吗? 编辑 结论: 如果我想将字符串插入数据库,则无需使用,只需使用即可。在显示数据时,请使用,这是您的全部意思

  • 问题内容: 我知道100%的保护是不可能的,但是对于大多数用户而言,它的保护性还是很高的。 例如,我遇到一个站点,在该站点上查看当前页面的源代码未返回任何内容。 在另一种情况下,访问或尝试从浏览器下载.js文件本身 会重定向您和其他内容。 如果您混淆了代码,那么解码它会很难吗?如果是这样,那也是另一个好的解决方案(建议使用哪种软件)? 问题答案: 根本不可能。 为了使访问者的浏览器能够执行脚本,他

  • 问题内容: 有没有一种方法可以基于Cython扩展中嵌入的循环来中断()Python脚本? 我有以下python脚本: 这会运行一个循环,该循环是C ++ Cython扩展的一部分。然后,在按的同时,将引发,但将其忽略,并且程序将继续进行直到模拟结束。 我发现的解决方法是通过捕获信号来处理扩展中的异常: 然后 : 我不能通过Python或至少从Cython进行这项工作吗?当我要在Windows /

  • 可能重复: 如何检查在Java中相乘两个数字是否会导致溢出? 假设我有一个Java类方法,它使用和操作。 如何确保中没有发生溢出? 我想我可以使用BigDecimal,也可以用“包装器”替换all and*,比如: 有没有更好的方法来确保Java方法中不会发生int溢出?

  • 本文向大家介绍Python中使用urllib2防止302跳转的代码例子,包括了Python中使用urllib2防止302跳转的代码例子的使用技巧和注意事项,需要的朋友参考一下 说明:python的urllib2获取网页(urlopen)会自动重定向(301,302)。但是,有时候我们需要获取302,301页面的状态信息。就必须获取到转向前的调试信息。 下面代码将可以做到避免302重定向到新的网页