2013-05-17 48 views
2

我有一個用Python編寫的程序(Linux版本2.7.3),它在循環中的許多文件上運行一個外部命令。它使用subprocess.check_output執行此操作,然後將輸出中的數據寫入Sqlite3數據庫。我有2個問題:當它運行一個子進程時,在Ctrl + C上終止Python程序

  1. 當我打Ctrl+C停止程序,所發生的一切是執行子被殺害,並且主程序只是下一次迭代繼續並啓動下一子。

  2. 如果我強制殺死它從另一個窗口kill -9它會退出,但數據庫文件不包含任何更改。

我一直在閱讀了幾個小時,並嘗試不同的東西,包括信號處理,try/finally等上。到目前爲止,我一直無法做到應該很簡單的事情。

那麼,如何讓Python程序接受Ctrl+C並乾淨地終止,以便其子進程結束並且其sqlite3數據庫已正確保存?

(只是補充說,如果程序是留給運行到完成,它退出乾淨,預期數據庫文件被更新)

+0

我在程序中添加了手動提交,現在至少數據庫在殺死程序後是最新的。現在我只需要弄清楚如何幹淨地處理'Ctrl + C'。 – starfry

+0

你的[父進程應該死於'KeyboardInterrupt'異常](https://gist.github.com/e2804f0934b505946b99)。你能否提供一個完整的最小代碼示例來顯示問題? – jfs

+0

對於延遲迴復感到抱歉。我將該程序剝離出來,並沒有出現問題,所以我打算在這裏做更多的調查。 – starfry

回答

0

有一個很好的討論/上理解資源在這裏殺子進程:How does Ctrl-C terminate a child process?

的SQL問題(沒有更多的信息)聽起來像是你從當你殺的過程中未成熟

+0

我真正想在這裏做的是殺死父進程(即Python程序)。如果我在終端中,並且在前臺執行Python程序,我希望能夠進入Ctrl + C並讓Python程序終止。現在發生的是隻有它的子進程被終止。我希望我在Python程序中需要一些代碼,但我不知道是什麼。 – starfry

0

我記得,你可以使用try /除檢查Ctrl-C提交的數據中斷的過程:

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

我在開發過程中一直這樣做,這樣如果我發現錯誤,我可以乾淨地停下來。

相關問題