我想知道如何退出Python而不对输出进行跟踪转储。

我仍然希望能够返回错误代码,但我不想显示回溯日志。

我希望能够退出使用出口(数字)没有跟踪,但在异常(不是出口)的情况下,我想要跟踪。


当前回答

下面的代码将不会引发异常,并且将在没有回溯的情况下退出:

import os
os._exit(1)

请参阅此问题和相关答案了解更多细节。很惊讶为什么其他答案都这么复杂。

这也不会进行适当的清理,如调用清理处理程序,刷新stdio缓冲区等(感谢pabouk指出这一点)。

其他回答

import sys
sys.exit(1)

比如import sys;sys.exit (0) ?

您可能遇到了一个异常,并且程序因此退出(带有回溯)。因此,要做的第一件事是在干净地退出(可能带有消息,给出的示例)之前捕获该异常。

在你的主要动作中尝试这样做:

import sys, traceback

def main():
    try:
        do main program stuff here
        ....
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    sys.exit(0)

if __name__ == "__main__":
    main()

更好的做法是避免使用sys.exit(),而是引发/处理异常以允许程序干净地完成。如果你想关闭回溯,只需使用:

sys.trackbacklimit=0

你可以在你的脚本顶部设置它来压缩所有的回溯输出,但我更喜欢少用它,例如“已知错误”,我希望输出是干净的,例如在文件foo.py中:

import sys
from subprocess import *

try:
  check_call([ 'uptime', '--help' ])
except CalledProcessError:
  sys.tracebacklimit=0
  print "Process failed"
  raise

print "This message should never follow an error."

如果CalledProcessError被捕获,输出将如下所示:

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

如果发生任何其他错误,我们仍然得到完整的回溯输出。

下面的代码将不会引发异常,并且将在没有回溯的情况下退出:

import os
os._exit(1)

请参阅此问题和相关答案了解更多细节。很惊讶为什么其他答案都这么复杂。

这也不会进行适当的清理,如调用清理处理程序,刷新stdio缓冲区等(感谢pabouk指出这一点)。