2011-12-06 9 views
4

터미널에 python main.py을 사용하여 호출하는 python 스크립트가 있습니다. 그것은 제대로 실행하고 GUI를 닫으면 종료되는 Qt-GUI를 시작합니다.Python 스크립트가 제대로 종료되지 않습니다.

그러나 마지막 디버그 메시지 인 "out and out"이 인쇄되지만 스크립트 자체가 종료되지 않는 경우가 있습니다. 어느 CTRL + C, CTRL D + CTRL + Z는 임의의 실행에 영향을 미친다. 마치 예외가 프로그램 내부에 던져 질 때 (그리고 GUI에 의해 잡힐 때) 이런 일이 일어나는 것처럼 보입니다.

GUI 자체에서 발생하지 않기 때문에 디버깅하는 방법을 모르겠습니다. 이것을 디버깅하고 내가 뭘 잘못했는지 알아 내려면 어떻게해야합니까?

if __name__ == '__main__': 
    import sys 

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

편집 : 마지막에는 여전히 활성화 된 스레드가있는 것처럼 보입니다. 그러나, 나는 explicetely 스레드 (나는 Qt가 내부적으로 무엇을하는지 모르겠다.)로 작업하지 않는다. 마지막에 실행중인 모든 스레드를 볼 수있는 방법이 있습니까?

EDIT2 : 오 마이 f * ing 신. 이 솔루션은 단순히 시스템을 재시작했습니다. 여하튼 나의 OS는 약간의 미친 물건을했고 스크립트가 종료되는 것을 막았다.

+0

문제를 확실하게 재생하는 비교적 작은 테스트 케이스를 만들 수 있습니까? 아주 자주이 작업을 시도하면 직접 솔루션으로 연결되거나 문제를 격리 할 수 ​​있습니다. – ekhumoro

답변

0

. 여하튼 나의 OS는 약간의 미친 물건을했고 스크립트가 종료되는 것을 막았다.

+0

당신의 OS? 당신은 Windoze를 의미합니까? –

+1

아이러니하게도 윈도우가 없습니다. – florianletsch

1

"어느 CTRL +C, CTRL D + CTRL + 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

GUI가 닫히기 전에 ctrl + c가 작동합니다. 스크립트가 "dead point"에 도달하면 ctrl + c가 더 이상 작동하지 않습니다. 코드를 삽입해도 마찬가지입니다. 코드에서 예외를 catch하지 않으면 pdb-debugger가 작동합니다. 지금까지는 다른 모든 것이 이미 종료 된 후에 만 ​​발생하기 때문에 내 문제에 도움이되지 않았습니다. 나는 그것을 얻지 않는다 : ( – florianletsch

관련 문제