ट्रेसबैक के बिना पायथन से कैसे बाहर निकलें?


277

मैं यह जानना चाहूंगा कि आउटपुट पर ट्रेसबैक डंप के बिना मैं पायथन से कैसे बाहर निकल सकता हूं।

मैं अभी भी एक त्रुटि कोड वापस करने में सक्षम होना चाहता हूं लेकिन मैं ट्रेसबैक लॉग प्रदर्शित नहीं करना चाहता।

मैं exit(number)ट्रेस का उपयोग किए बिना बाहर निकलने में सक्षम होना चाहता हूं, लेकिन अपवाद (एक निकास नहीं) के मामले में मैं ट्रेस चाहता हूं।


8
sys.exit () बैकट्रेस को प्रिंट किए बिना निष्पादन को रोक देता है, एक अपवाद उठाता है ... आपका प्रश्न वास्तव में बताता है कि डिफ़ॉल्ट व्यवहार क्या है, इसलिए कुछ भी न बदलें।
लुपर रूच

@Luper यह जांचना बहुत आसान है कि sys.exit () SystemExit फेंकता है!
वैल

4
मैंने कहा कि यह एक ट्रेसबैक प्रिंट नहीं करता है, ऐसा नहीं है कि यह एक अपवाद नहीं बढ़ाता है।
लूपप रच

मुझे लगता है कि यह वास्तव में आपके द्वारा
स्टीफन

2
क्या यह प्रश्न विशेष रूप से जाइथॉन 2.4 के लिए है या ऐसा कुछ है? क्योंकि पायथन के आधुनिक संस्करणों के लिए (यहां तक ​​कि 2009 में, जब कि सीपीथॉन 2.6 और 3.1 का मतलब था, ज्यथोन 2.5 और आयरनपथॉन 2.6), सवाल कोई मतलब नहीं है, और शीर्ष उत्तर गलत हैं।
अब्राह्मण

जवाबों:


300

आप संभवतः एक अपवाद का सामना कर रहे हैं और इस वजह से प्रोग्राम बाहर निकल रहा है (ट्रेसबैक के साथ)। इसलिए पहली बात यह है कि उस अपवाद को पकड़ना, सफाई से बाहर निकलने से पहले (शायद एक संदेश, उदाहरण के साथ दिया गया)।

अपनी 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()

2
शुरुआत में "एसईएस आयात निकास से" जैसा कुछ होना चाहिए।
लूटने

10
यदि sys.exit () को "मुख्य प्रोग्राम स्टफ" में कहा जाता है, तो उपरोक्त कोड sys.exit को दिए गए मान को दूर फेंक देता है। ध्यान दें कि sys.exit SystemExit उठाता है और चर "e" में निकास कोड होगा।
21

5
मेरा सुझाव है कि मैं प्रिंटिंग स्टेयरर्स sys.stderr.write (msg)
विनिलियोस

14
मैं दृढ़ता से से लाइनों को हटाने का सुझाव except Exception:करने के लिए sys.exit(0)समावेशी,। यह पहले से ही सभी गैर-संभाला अपवादों पर एक ट्रेसबैक प्रिंट करने और कोड समाप्त होने के बाद बाहर निकलने के लिए डिफ़ॉल्ट व्यवहार है, इसलिए मैन्युअल रूप से ऐसा करने से क्यों परेशान होते हैं?
MestreLion

6
@jkp - अपनी टिप्पणी के बारे में: sys.exit()कार्यक्रमों के लिए इस्तेमाल किया जाना चाहिए। exit()इंटरैक्टिव गोले के लिए करना है। पायथन में निकास () और sys.exit () के बीच अंतर देखें ?
ire_and_curses

81

शायद आप सभी अपवादों को पकड़ने की कोशिश कर रहे हैं और यह अपवाद को पकड़ रहा 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। यह निश्चित रूप से एक कोने का मामला है!


4
-1: यह कोड मूर्खतापूर्ण है: SystemExitकेवल कॉल करने के लिए क्यों पकड़ें sys.exit(e)? दोनों लाइनों को हटाने का समान प्रभाव होता है। इसके अलावा, सफाई से संबंधित है finally:, नहीं except Exception: ... raise
MestreLion

@MestreLion: आप डाउनवोट होने के लिए स्वतंत्र हैं, लेकिन यदि आप मेरी टिप्पणी को सिर्फ आपके ऊपर पढ़ते हैं, तो यह केवल 2.5+ के लिए सच है। यदि आप मेरे सभी पोस्ट पढ़ते हैं, तो मैंने स्पष्ट रूप से कहा कि कोड मूर्खतापूर्ण है और आपने अपनी टिप्पणी में जो कहा है, उसका सुझाव दिया है।
bstpierre 15

2
क्षमा करें, आप सही हैं ... मैं भूल गया कि पायथन 2.5 में अपवादों की एक प्रमुख संरचना थी। मैंने डाउनवोट को पूर्ववत करने की कोशिश की, लेकिन एसओ केवल मुझे ऐसा करने की अनुमति देता है अगर जवाब संपादित किया जाता है। इसलिए, चूंकि हम 2012 में हैं और पायथन 2.4 प्राचीन इतिहास है, इसलिए इसे संपादित नहीं किया और सही (वर्तमान) कोड अपफ्रंट दिखाते हुए, पूर्व 2.5 विधि को फुटनोट के रूप में छोड़ दिया? यह उत्तर में बहुत सुधार करेगा और मैं नीचे को पूर्ववत करने में सक्षम हो जाऊंगा, और ख़ुशी से ऐसा करूँगा। सभी के लिए जीत-जीत :)
MestreLion

@MestreLion: जैसा कि आपने सुझाव दिया, मैंने संपादन शुरू कर दिया, लेकिन यह उत्तर वास्तव में केवल सवाल और 2.4 वातावरण के संदर्भ में समझ में आता है। चढ़ाव मुझे परेशान नहीं करता है।
bstpierre


9

कुछ पसंद है import sys; sys.exit(0)?


@mestreLion फिर मुझे Dets 06 18:53:17 ट्रैसबैक (सबसे हालिया कॉल अंतिम) क्यों मिलता है: फ़ाइल "debug_new.py", पंक्ति 4, में <मॉड्यूल> आयात sys; sys.exit (0) SystemExit: 0 at org.python.core.PyException.fillInStackTrace (PyException.java:70) मेरे कंसोल में?
वैल

3
@Val: क्योंकि आप एक मानक अजगर कंसोल का उपयोग नहीं कर रहे हैं। जाइथन पायथन नहीं है, और यह ऐसा दिखता है (या कम से कम इसके कंसोल) अपवादों को अलग तरीके से संभालता है।
MestreLion


9

निम्न कोड अपवाद नहीं उठाएगा और ट्रेसबैक के बिना बाहर निकल जाएगा:

import os
os._exit(1)

अधिक विवरण के लिए यह प्रश्न और संबंधित उत्तर देखें। आश्चर्य है कि अन्य सभी उत्तर इतने अधिक क्यों हैं।


4

यह बेहतर है कि आप 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

यदि कोई अन्य त्रुटि होती है, तो भी हमें पूर्ण ट्रेसबैक आउटपुट मिलता है।


1
sys.trackbacklimitपायथन 3 में उपयोग करने के लिए , यह उत्तर देखें ।
एक्यूमेनस

4

बिल्ट-इन पायथन फंक्शन का उपयोग करें () और यही है। किसी भी पुस्तकालय को आयात करने की आवश्यकता नहीं है। मैं अजगर 3.4 का उपयोग कर रहा हूं



0

व्हाट अबाउट

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

कोई ट्रेसबैक और किसी तरह अधिक स्पष्ट नहीं।


-8
# 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

7
यदि आप कोड की टिप्पणी करेंगे, तो इससे उत्तर की गुणवत्ता बढ़ जाएगी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.