停止python关闭错误

时间:2009-04-22 23:31:27

标签: python debugging

在python中运行脚本时是否有办法在吐出回溯后停止控制台窗口关闭?

9 个答案:

答案 0 :(得分:16)

如果您在Windows操作系统上执行此操作,则可以使用以下命令为快捷方式的目标添加前缀:

C:\WINDOWS\system32\cmd.exe /K <command>

这将阻止窗口在命令退出时关闭。

答案 1 :(得分:15)

try:
    #do some stuff
    1/0 #stuff that generated the exception
except Exception as ex:
    print ex
    raw_input()

答案 2 :(得分:13)

您可以注册一个顶级异常处理程序,以便在发生未处理的异常时使应用程序保持活动状态:

def show_exception_and_exit(exc_type, exc_value, tb):
    import traceback
    traceback.print_exception(exc_type, exc_value, tb)
    raw_input("Press key to exit.")
    sys.exit(-1)

 import sys
 sys.excepthook = show_exception_and_exit

如果在C代码中调用的事件处理程序中发生异常,这通常不会传播错误,这将非常有用。

答案 3 :(得分:7)

你可以有第二个脚本,它可以导入/运行你的主代码。此脚本将捕获所有异常,并打印回溯(然后在结束前等待用户输入)

假设您的代码是使用if __name__ == "__main__": main()惯用语构建的。

def myfunction():
    pass

class Myclass():
    pass

def main():
    c = Myclass()
    myfunction(c)

if __name__ == "__main__":
    main()

..并且文件名为“myscriptname.py”(显然可以更改),以下内容可以正常工作

from myscriptname import main as myscript_main

try:
    myscript_main()
except Exception, errormsg:
    print "Script errored!"
    print "Error message: %s" % errormsg
    print "Traceback:"
    import traceback
    traceback.print_exc()
    print "Press return to exit.."
    raw_input()

(请注意,raw_input()中的input()已替换为main()

如果您没有try:函数,则可以在try: import myscriptname except [...] 块中使用import语句:

cmd

一个更好的解决方案,一个不需要额外包装脚本的解决方案,就是从IDLE或命令行运行脚本。

在Windows上,转到“开始”&gt;运行,输入cd "\Path\To Your\ Script\" \Python\bin\python.exe myscriptname.py 并输入。然后输入类似的东西。

C:\Python\

(如果您将Python安装到cd /home/your/script/

在Linux / Mac OS X上,它更容易一点,你只需运行python myscriptname.py然后F5

最简单的方法是使用IDLE,启动IDLE,打开脚本并单击运行按钮(我认为Ctrl+F5C:\WINDOWS\system32\cmd.exe /K [existing command] )。当脚本退出时,窗口不会自动关闭,因此您可以看到任何错误

此外,正如Python 3所建议的那样,在Windows上,您可以创建脚本的快捷方式,并在其中使用“为...”作为前缀的目标。

/K command - Executes the specified command and continues running.

来自Chris Thornhill

{{1}}

答案 4 :(得分:4)

在UNIX系统上(Windows已在上面介绍过......),您可以更改解释器参数以包含-i标志:

#!/ usr / bin / python -i

从手册页:

  

-i

     

当脚本作为第一个参数传递或使用-c选项时,请在执行脚本或命令后进入交互模式。它不会读取$ PYTHONSTARTUP文件。当脚本引发异常时,这对于检查全局变量或堆栈跟踪非常有用。

答案 5 :(得分:2)

在Windows中,不是双击py文件,而是将其拖动到已打开的CMD窗口中,然后按Enter键。它在异常后保持打开状态。

答案 6 :(得分:0)

您的问题不是很清楚,但我认为当发生异常时,python解释器会退出(因此调用控制台窗口会关闭)。

您需要修改python应用程序以捕获异常并在不退出解释器的情况下打印它。一种方法是打印“按ENTER退出”,然后从控制台窗口读取一些输入,有效地等待用户按Enter键。

答案 7 :(得分:0)

如果您使用的是Windows,则可以执行此操作

    import os

    #code here 

    os.system('pause')

答案 8 :(得分:0)

看看这个问题的答案:How to find exit code or reason when atexit callback is called in Python?

您可以仅复制此ExitHooks类,然后自定义自己的foo函数,然后将其注册到atexit

import atexit
import sys, os

class ExitHooks(object):
    def __init__(self):
        self.exit_code = None
        self.exception = None

    def hook(self):
        self._orig_exit = sys.exit
        sys.exit = self.exit
        sys.excepthook = self.exc_handler

    def exit(self, code=0):
        self.exit_code = code
        self._orig_exit(code)

    def exc_handler(self, exc_type, exc, *args):
        self.exception = exc

hooks = ExitHooks()
hooks.hook()

def goodbye():
    if not (hooks.exit_code is None and hooks.exception is None):
        os.system('pause')
#       input("\nPress Enter key to exit.")

atexit.register(goodbye)