2011-12-06 85 views
4

我有一個python腳本,我在終端上使用python main.py調用。它啓動一個正確執行的Qt-GUI,並在關閉GUI時終止。Python腳本不能正常終止

但是,有時會打印上一個調試消息「over and out」,但腳本本身不會終止。既不CTRL + ÇCTRL + d也不CTRL + Ž對執行的任何影響。在我看來,如果在程序內部拋出異常(並被GUI捕獲)時發生這種情況。

我不知道如何調試,因爲它顯然不會發生在GUI本身。我如何調試這個並找出,我做錯了什麼?

if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    form = MainGui() 
    form.show() 
    app.exec_() 
    print "over and out" 

編輯:在我看來,好像有一些線程仍然活躍在最後。但是,我並沒有用線程工作(我不知道Qt在內部做什麼)。有沒有辦法查看所有正在運行的線程?編輯2:哦,我的上帝啊。解決方案只是重新啓動我的系統。不知何故,我的操作系統做了一些瘋狂的事情,並阻止腳本終止。

+0

您可以創建一個合理的小測試用例,可靠地重現問題嗎?很多時候,試圖做到這一點將導致您直接找到解決方案,或者至少隔離問題。 – ekhumoro

回答

0

解決的辦法就被重新啓動我的系統。不知何故,我的操作系統做了一些瘋狂的事情,並阻止腳本終止。

+0

您的操作系統?您的意思是Windoze? –

+1

具有諷刺意味的不是windows。Mac OS。) – florianletsch

1

「無論CTRL + ÇCTRL + d也不CTRL + Ž對執行任何影響」。

的幾行代碼添加到你的程序的頭和CTRL +ç退出。

import signal 
signal.signal(signal.SIGINT, signal.SIG_DFL) 

如果你想自動進入PDB調試器時程序打個例外,只是這樣做:

import sys 

def excepthook(type_, value, tb): 
    import pdb 
    import traceback 

    # print the exception... 
    traceback.print_exception(type_, value, tb) 
    print 
    # ...then start the debugger in post-mortem mode 
    pdb.pm() 

# we are NOT in interactive mode 
if not hasattr(sys, 'ps1') or sys.stderr.target.isatty(): 
    # this stops PyQt from freezing the terminal 
    from PyQt4.QtCore import pyqtRemoveInputHook 
    pyqtRemoveInputHook() 

    sys.excepthook = excepthook 
+0

ctrl + c在GUI關閉之前工作。當腳本在打印信息ctrl + c不起作用時達到此「死點」時 - 即使插入了您的代碼。 如果我沒有在我的代碼中發現異常,pdb-debugger可以正常工作。到目前爲止,這並沒有幫助我解決問題,因爲它只發生在其他所有事情都已經終止之後。 我不明白:( – florianletsch