【问题标题】:Terminate Python program on Ctrl+C when it's running a subprocess运行子进程时在 Ctrl+C 上终止 Python 程序
【发布时间】:2013-05-12 18:13:25
【问题描述】:

我有一个用 Python(Linux 上的版本 2.7.3)编写的小程序,它在循环中对多个文件运行外部命令。它使用subprocess.check_output 执行此操作,然后将输出中的数据写入 Sqlite3 数据库。我有两个问题:

  1. 当我点击Ctrl+C 停止程序时,所发生的只是正在执行的子进程被终止,主程序继续下一次迭代并启动下一个子进程。

  2. 如果我从另一个窗口用kill -9 强制杀死它,它会退出,但数据库文件不包含任何更改。

我已经阅读了几个小时并尝试了各种事情,包括信号处理程序、try/finally 等等。到目前为止,我一直无法做应该很简单的事情。

那么,如何让 Python 程序接受 Ctrl+C 并干净地终止,以便其子进程结束并正确保存其 sqlite3 数据库?

(只是补充一点,如果让程序运行到完成,它确实会干净地退出并且数据库文件会按预期更新)

【问题讨论】:

  • 我在程序中添加了手动提交,现在至少在杀死程序后数据库是最新的。现在我只需要弄清楚如何干净地处理Ctrl+C
  • 你的parent process should die with KeyboardInterrupt exception。您能否提供一个完整的最小代码示例来说明问题?
  • 抱歉延迟回复。我将程序剥离为基础,它没有表现出问题,所以我将在这里做更多的调查。

标签: sqlite subprocess python-2.x


【解决方案1】:

这里有一个很好的关于理解杀死子进程的讨论/资源:How does Ctrl-C terminate a child process?

sql 问题(没有更多信息)听起来像是在您不成熟地终止进程时中断了提交数据的进程

【讨论】:

  • 我在这里真正想做的是杀死父进程(即 Python 程序)。如果我在终端中并在前台执行 Python 程序,我希望能够输入 Ctrl+C 并让 Python 程序终止。现在发生的事情是只有它的子进程被终止。我希望我需要 Python 程序中的一些代码,但我不知道是什么。
【解决方案2】:

我记得,您可以使用 try/except 来检查 Ctrl-C

try:
    #code here...
except KeyboardInterrupt:
    #cleanup code...

我在开发过程中一直这样做,以便在发现问题时可以立即停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多