سؤال

أود أن أعرف كيف يمكنني الخروج من بيثون دون وجود تفريغ Traceback على الإخراج.

ما زلت أريد أريد أن أكون قادرا على إرجاع رمز الخطأ لكنني لا أريد عرض سجل Traceback.

أريد أن أكون قادرا على الخروج باستخدام exit(number) دون تتبع ولكن في حالة استثناء (وليس خروج) أريد التتبع.

هل كانت مفيدة؟

المحلول

من المفترض أن تواجه استثناء ويتم إخراج البرنامج بسبب هذا (مع Traceback). أول شيء يجب القيام به هو التقاط هذا الاستثناء، قبل الخروج بشكل نظيف (ربما مع رسالة، مثال معين).

جرب شيئا مثل هذا في 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()

نصائح أخرى

ربما كنت تحاول التقاط جميع الاستثناءات وهذا هو اللحاق 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. وبعد هذه هي بالتأكيد حالة الزاوية!

import sys
sys.exit(1)

شيء مثل import sys; sys.exit(0) ?

لن يثير التعليمات البرمجية التالية استثناء وسوف يخرج بدون Traceback:

import os
os._exit(1)

انظر هذا السؤال والإجابات ذات الصلة لمزيد من التفاصيل. فاجأ لماذا جميع الإجابات الأخرى غير معقلة للغاية.

من الأفضل كثيرا تجنب استخدام SYS.EXIT () وبدلا من ذلك رفع / معالجة الاستثناءات للسماح للبرنامج بالانتهاء بشكل نظيف. إذا كنت ترغب في إيقاف تشغيل Traceback، فما عليك سوى استخدام:

sys.trackbacklimit=0

يمكنك تعيين هذا في الجزء العلوي من البرنامج النصي الخاص بك إلى الاسكواش جميع إخراج Traceback، لكنني أفضل استخدامه بشكل أكثر صرامة، على سبيل المثال "الأخطاء المعروفة" حيث أريد أن يكون الإخراج نظيفا، على سبيل المثال في الملف 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."

إذا تم القبض على الإلغاء، فستبدو الإخراج مثل هذا:

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

في حالة حدوث أي خطأ آخر، ما زلنا نحصل على إخراج Traceback الكامل.

استخدم وظيفة Python المضمنة () وهذا هو. لا حاجة لاستيراد أي مكتبة. أنا أستخدم بيثون 3.4

سأفعل ذلك بهذه الطريقة:

import sys

def do_my_stuff():
    pass

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

ماذا عن

import sys
....
....
....
sys.exit("I am getting the heck out of here!")

لا traceback وبشيء أكثر صراحة.

# 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top