2009-07-27 76 views
211

我想知道如何從Python退出而不在輸出上追蹤轉儲。如何退出Python而沒有追溯?

我仍然希望能夠返回錯誤代碼,但我不想顯示追溯日誌。

我想能夠退出使用exit(number)沒有痕跡,但在一個例外(不是退出)的情況​​下,我想跟蹤。

+6

sys.exit()停止執行而不打印回溯,引發異常......您的問題確切地描述了默認行爲,因此不要更改任何內容。 – 2009-07-27 17:43:55

+0

@Luper檢查sys.exit()是否會拋出SystemExit非常容易! – Val 2012-10-01 18:45:50

+4

我說它不打印回溯,並不是說它不會引發異常。 – 2012-10-02 05:45:03

回答

238

你大概會遇到一個異常,程序正在退出,因爲這(帶回溯)。因此,要做的第一件事就是在完全退出之前(可能會給出一條消息,給出示例)來捕獲該異常。

嘗試在你的日常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() 
40
import sys 
sys.exit(1) 
10

有點像import sys; sys.exit(0)

+4

Downvote。它拋出SystemExit,導致回溯 – Val 2012-10-01 18:39:09

+7

@Val:再次出錯。它不會引起回溯 – MestreLion 2012-12-05 11:48:20

64

也許你正在試圖捕獲所有異常,這是捕捉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會得到。這絕對是一個角落案例!

-6
# 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 
2

我會做這種方式:

import sys 

def do_my_stuff(): 
    pass 

if __name__ == "__main__": 
    try: 
     do_my_stuff() 
    except SystemExit, e: 
     print(e) 
3

這是更好的做法是避免使用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 

如果發生任何其他錯誤,我們仍然可以得到完整的回溯輸出。

3

使用內置的python函數quit()就是這樣。 無需導入任何庫。 我正在使用python 3.4