Python脚本未能正确终止。

5
我有一个Python脚本,通过在终端中使用“python main.py”调用。它启动了一个Qt-GUI,并成功执行并在关闭GUI时终止。
然而,有时会打印最后一个调试消息“结束”,但脚本本身不会终止。无论是ctrl+cctrl+d还是ctrl+z都没有任何影响。我认为这似乎发生在程序内抛出异常(并被GUI捕获)时发生。
我不知道如何调试这个问题,因为显然它不会发生在GUI本身。如何调试并找出我做错了什么?
if __name__ == '__main__':
    import sys 

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

编辑:看起来在最后仍有一些线程仍在运行。然而,我并没有显式地使用线程(我不知道Qt在内部做了什么...)。有没有一种方法可以查看所有正在运行的线程?

编辑2:我的天啊。解决方案就是重新启动系统。不知何故,我的操作系统做了一些疯狂的事情,阻止了脚本的终止。


你能否创建一个相当小的测试用例以可靠地重现问题?往往,尝试这样做要么会直接导致解决方案,要么至少会隔离出问题。 - ekhumoro
2个回答

1

“无论是 ctrl+cctrl+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

在 GUI 关闭之前,ctrl+c 可以工作。当脚本到达打印消息后的“死点”时,即使插入了您的代码,ctrl+c 也无法正常工作。如果我没有在代码中捕获异常,pdb-debugger 可以使用。但到目前为止,这对我的问题没有帮助,因为它只发生在所有其他操作都已终止之后。我不明白 :( - florianletsch

0
解决方案很简单,就是重新启动我的系统。不知何故,我的操作系统做了一些疯狂的事情,阻止了脚本的终止。

1
具有讽刺意味的是,不是Windows,而是Mac OS。 ;) - florianletsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接