【问题标题】:Why is sys.exit() causing a traceback?为什么 sys.exit() 会导致回溯?
【发布时间】:2018-07-12 06:39:49
【问题描述】:

根据How to exit from Python without traceback?,在 Python 脚本中调用 sys.exit() 应该会静默退出而不会回溯。

import sys
sys.exit(0)

但是,当我在 Windows 7 上使用python -i "exit.py" (or from Notepad++) 的命令行启动脚本时,会显示SystemExit 异常的回溯。

U:\>python -i "exit.py"
Traceback (most recent call last):
  File "exit.py", line 2, in <module>
    sys.exit(0)
SystemExit: 0
>>>

为什么sys.exit() 从 Windows 命令行运行时显示回溯?

(作为参考,我在 Windows 7 上使用 Python 3.6.4)

【问题讨论】:

  • 你不能。这是sys.exit() 的实现方式。
  • @GhilasBELHADJ 您的链接使用 Python 2 文档。您应该使用Python 3 docs 重新发布。
  • 请注意,这并不是真正的回溯。 SystemExit 异常没有回溯

标签: python cmd exit traceback


【解决方案1】:

您正在运行带有 -i 标志的 Python。 -i suppresses the usual special handling of the SystemExit exception sys.exit raises;由于特殊处理被抑制,Python 执行正常的异常处理,打印回溯。

可以说,-i 应该只抑制特殊处理的“退出”部分,而不会导致打印回溯。你可以提出bug report;我没有看到任何现有的相关报告。

【讨论】:

  • 使用os._exit(0)时,可以不带任何回溯退出"-i"
  • @Matt.St: os.exit 是一个激烈的举动,无需任何清理即可退出。没有finally__exit__atexit__del__ 等。这里不太适合。
  • 你是绝对正确的@user2357112,但如果他想要大刀阔斧,它可以工作
【解决方案2】:

未显示异常:

python exit.py 

你的程序被终止了。

使用-i 交互式选项运行(在运行脚本后以交互方式检查)并显示异常:

python -i exit.py 
Traceback (most recent call last):
  File "exit.py", line 2, in <module>
    sys.exit(0)
SystemExit: 0
>>> 

因为解释器一直在运行。

exit([status])

通过引发 SystemExit(status) 退出解释器。

【讨论】:

    【解决方案3】:

    As Matt_G says, sys.exit(0) 与提升SystemExit() 完全相同,可以在更高级别捕获,在您的情况下发生这种情况,因为您使用的是-i

    如果你想在没有回溯的情况下退出,os._exit(0) 会调用“C 函数”并且即使在 -i 模式下也会立即退出

    正如@user2357112 告诉我的那样,os._exit(0) 是一个激进的举动,无需任何清理即可退出。没有最后,__exit__atexit__del__

    【讨论】:

      【解决方案4】:

      因为在后台,sys.exit(0) 引发了 SystemExit 异常。

      延伸阅读here

      你想要的是:

      os._exit(1)
      

      【讨论】:

      • os._exit(1) 会抑制回溯,但也会抑制所有退出清理并立即退出。这可能会导致数据丢失。
      【解决方案5】:

      因为您使用的是 -i 选项。不使用它试试,你不会得到堆栈跟踪。

      $ python ptest.py
      $ python -i ptest.py
      Traceback (most recent call last):
        File "ptest.py", line 3, in <module>
          sys.exit(0)
      SystemExit: 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 2012-12-31
        • 2014-01-01
        • 2017-03-10
        • 2019-12-01
        相关资源
        最近更新 更多