2011-12-06 12 views
4

私は端末でpython main.pyを使用して呼び出すpythonスクリプトを持っています。 Qt-GUIを起動し、GUIを終了すると正しく実行され、終了します。Pythonスクリプトが正しく終了しない

ただし、最後のデバッグメッセージ「オーバーおよびアウト」が表示されることもありますが、スクリプト自体は終了しません。実行に影響を及ぼさもCTRL + CCTRL + DCTRL + Z。プログラム内で例外がスローされたとき(GUIによって捕捉されたとき)に起こるかのように思えます。

明らかにGUI自体では発生しないので、これをデバッグする方法はわかりません。どのように私はこれをデバッグし、私が間違って何を見つけますか?

if __name__ == '__main__': 
    import sys 

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

EDIT:まだまだアクティブになっているスレッドがあるようです。しかし、私はスレッドで徹底的に動作しません(私はQtが内部的に何をしているのか分かりません...)。最後に実行中のスレッドをすべて表示する方法はありますか?

EDIT2:Oh my f * ing god。解決策は私のシステムを単に再始動させることでした。どういうわけか私のOSはいくつか狂ったことをして、スクリプトが終了するのを防ぎました。

+0

問題を確実に再現する合理的に小さなテストケースを作成できますか?非常に頻繁にこれをやろうとすると、解決策に直接つながるか、少なくとも問題を特定します。 – ekhumoro

答えて

0

。どういうわけか私のOSはいくつか狂ったことをして、スクリプトが終了するのを防ぎました。

+0

あなたのOS?あなたはWindozeを意味しますか? –

+1

皮肉なことにウィンドウズMac OS。;) – florianletsch

1

"どちらCTRL + CCTRL + DCTRL実行に影響を及ぼさ + Z"。

は、プログラムのヘッダにこれらのコード行を追加し、CTRL + Cはそれを終了します。

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

関連する問題