停止python关闭错误

Sha*_*ard 17 python debugging

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

Tor*_*rek 17

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

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
Run Code Online (Sandbox Code Playgroud)

如果在C代码中调用的事件处理程序中发生异常,这通常不会传播错误,这一点尤其有用.

  • 但是那些`exc_type,exc_value,tb`参数是什么呢?(我正在使用python 3.6) (2认同)

Chr*_*ill 16

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

C:\WINDOWS\system32\cmd.exe /K <command>
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*tin 15

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

  • 您可能希望使用`traceback.print_exc()`而不是`print ex`来获得更详细的堆栈跟踪 (3认同)

dbr*_*dbr 7

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

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

def myfunction():
    pass

class Myclass():
    pass

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

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

..并且该文件名为"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()
Run Code Online (Sandbox Code Playgroud)

(注意raw_input()已input()在Python 3中替换)

如果您没有main()函数,则可以在try:块中使用import语句:

try:
    import myscriptname
except [...]
Run Code Online (Sandbox Code Playgroud)

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

在Windows上,转到"开始">"运行",然后输入cmd并输入.然后输入类似的东西..

cd "\Path\To Your\ Script\"
\Python\bin\python.exe myscriptname.py
Run Code Online (Sandbox Code Playgroud)

(如果你安装了Python C:\Python\)

在Linux/Mac OS X上它是一个更容易一点,你只要运行cd /home/your/script/则python myscriptname.py

最简单的方法是使用IDLE,启动IDLE,打开脚本并单击运行按钮(F5或者Ctrl+F5我认为).当脚本退出时,窗口不会自动关闭,因此您可以看到任何错误

此外,正如Chris Thornhill所建议的那样,在Windows上,您可以创建脚本的快捷方式,并在其中使用属性为目标前缀...

C:\WINDOWS\system32\cmd.exe /K [existing command]
Run Code Online (Sandbox Code Playgroud)

来自http://www.computerhope.com/cmd.htm:

/K command - Executes the specified command and continues running.
Run Code Online (Sandbox Code Playgroud)


小智 6

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

#!/ usr / bin / python -i

从手册页:

-一世

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