我有一个python脚本在数据库中运行大约50,000个项目,每个项目大约需要10秒钟,我想停止它。
但是,如果我只是按下ctrl + C,而代码在try除部分之外,那么我的程序输入expect语句并删除该项然后继续。关闭程序的唯一方法是以这种方式重复删除项目,直到我,只是纯粹的运气,不在try语句中捕获它。
如何在不杀死try语句的情况下退出脚本?
编辑1
我的陈述看起来像这样:
for item in items:
try:
if is_item_gone(content) == 1:
data = (item['id'])
db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data)
else:
do alot of stuff
except:
data = (item['id'])
db.delete('...')
编辑2
我连接到db代码的顶部如下:
#!/usr/bin/python
import MySQLdb
import sys
class Database:
....
答案 0 :(得分:2)
问题是因为你使用了一个除了之外的,这总是一个坏主意,如果你捕获了特定的例外,那么当你的脚本将KeyboardInterrupt
停止时:
for item in items:
try:
if is_item_gone(content) == 1:
data = (item['id'])
db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data)
else:
do alot of stuff
except MySQLdb.Error as e:
print(e)
data = (item['id'])
db.delete('...')
如果您还有其他例外情况,可以在except:
中使用multiple except (KeyError, MySQLdb.Error) as e
至少你可以抓住Exception as e
并打印错误。
for item in items:
try:
if is_item_gone(content) == 1:
data = (item['id'])
db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data)
else:
do alot of stuff
except Exception as e:
print(e)
data = (item['id'])
db.delete('...')
故事的寓意是不要使用毯子,除了抓住你所期望的并记录错误也可能是一个好主意。 exception-hierarchy也值得一读,看看你到底抓到了什么。
答案 1 :(得分:1)
我会像这样重写它:
try:
# ...
except Exception: # I would use an even more specific exception here if you can.
data = (item['id'])
db.delete('...')
或者只是
def _main(args):
...
if __name__ == '__main__':
try:
sys.exit(_main(sys.argv[1:]))
except KeyboardInterrupt:
print >> sys.stderr, '%s: interrupted' % _SCRIPT_NAME
sys.exit(1)
Python 2的例外情况可以在这里找到:https://docs.python.org/2/library/exceptions.html#exception-hierarchy
此外,许多脚本都是用底部的锅炉板写的:
except:
当您在主体中使用except Exception:
而不是KeyboardInterrupt
时,您不允许此顶级异常块捕获KeyboardInterrupt
。 (你不 实际抓住它让Ctrl-C工作 - 这只会在{{1}}被引发时变得更漂亮。)
答案 2 :(得分:0)
<!--[if (!IE 8)|(!IE 9)]><!-->
<p>Not IE8, or IE9. Multiple Upload</p>
<!--<![endif]-->
<!--[if (IE 8)|(IE 9)]>
<p>IE8, or IE9. Single Upload</p>
<![endif]-->
这将在任何给定时间注册并捕获例如 Ctrl + c 。处理程序将相应地终止套接字,然后退出,退出代码为0,这是一个很好的退出代码。
这是捕捉键盘中断的更“全局”的方法。