我想知道如何從Python退出而不在輸出上追蹤轉儲。如何退出Python而沒有追溯?
我仍然希望能夠返回錯誤代碼,但我不想顯示追溯日誌。
我想能夠退出使用exit(number)
沒有痕跡,但在一個例外(不是退出)的情況下,我想跟蹤。
我想知道如何從Python退出而不在輸出上追蹤轉儲。如何退出Python而沒有追溯?
我仍然希望能夠返回錯誤代碼,但我不想顯示追溯日誌。
我想能夠退出使用exit(number)
沒有痕跡,但在一個例外(不是退出)的情況下,我想跟蹤。
你大概會遇到一個異常,程序正在退出,因爲這(帶回溯)。因此,要做的第一件事就是在完全退出之前(可能會給出一條消息,給出示例)來捕獲該異常。
嘗試在你的日常main
是這樣的:
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()
import sys
sys.exit(1)
有點像import sys; sys.exit(0)
?
Downvote。它拋出SystemExit,導致回溯 – Val 2012-10-01 18:39:09
@Val:再次出錯。它不會引起回溯 – MestreLion 2012-12-05 11:48:20
也許你正在試圖捕獲所有異常,這是捕捉SystemExit
例外通過sys.exit()
長大的嗎?
import sys
try:
sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
sys.exit(e)
except:
# Cleanup and reraise. This will print a backtrace.
# (Insert your cleanup code here.)
raise
通常,使用except:
而不命名異常是一個壞主意。你會捕捉到所有你不想捕捉的東西 - 比如SystemExit
- 它也可以掩蓋你自己的編程錯誤。我上面的例子很愚蠢,除非你正在做一些清理工作。
import sys
sys.exit(1) # Or something that calls sys.exit().
如果您需要在不提高SystemExit
退出:您可以將其替換爲
import os
os._exit(1)
我做到這一點,在單元測試下運行,並且呼籲fork()
代碼。當分叉進程提升SystemExit
時,Unittest會得到。這絕對是一個角落案例!
# Pygame Example
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('IBM Emulator')
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
fontObj = pygame.font.Font('freesansbold.ttf', 32)
textSurfaceObj = fontObj.render('IBM PC Emulator', True, GREEN,BLACK)
textRectObj = textSurfaceObj.get_rect()
textRectObj = (10, 10)
try:
while True: # main loop
DISPLAYSURF.fill(BLACK)
DISPLAYSURF.blit(textSurfaceObj, textRectObj)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
except SystemExit:
pass
我會做這種方式:
import sys
def do_my_stuff():
pass
if __name__ == "__main__":
try:
do_my_stuff()
except SystemExit, e:
print(e)
這是更好的做法是避免使用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被捕獲,輸出將是這樣的:
[[email protected] dev]$ ./foo.py
usage: uptime [-V]
-V display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1
如果發生任何其他錯誤,我們仍然可以得到完整的回溯輸出。
使用內置的python函數quit()就是這樣。 無需導入任何庫。 我正在使用python 3.4
sys.exit()停止執行而不打印回溯,引發異常......您的問題確切地描述了默認行爲,因此不要更改任何內容。 – 2009-07-27 17:43:55
@Luper檢查sys.exit()是否會拋出SystemExit非常容易! – Val 2012-10-01 18:45:50
我說它不打印回溯,並不是說它不會引發異常。 – 2012-10-02 05:45:03