2013-02-08 19 views
7

क्या कमांड लाइन पर रंगीन होने के अपवाद के संदेश प्राप्त करने का कोई आसान तरीका है? उदाहरण के लिएटर्मिनल पर पाइथन से रंग अपवाद

def g(): f() 
def f(): 1/0 
g() 

त्रुटि

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    g() 
    File "test.py", line 1, in g 
    def g(): f() 
    File "test.py", line 2, in f 
    def f(): 1/0 
ZeroDivisionError: integer division or modulo by zero 

देता है मैं चाहूँगा "पूर्णांक विभाजन या सापेक्ष शून्य द्वारा" रंग या टर्मिनल पर प्रकाश डाला जाना है, ताकि मैं जल्दी से एक से बाहर ले सकते हैं लंबे ट्रेसबैक (केवल लिनक्स)। आदर्श रूप में, मैं प्रत्येक अपवाद के लिए एक कस्टम क्लास लिखना नहीं चाहता, लेकिन किसी भी तरह से सभी प्रकार को पकड़ और प्रारूपित करता हूं।

संपादित करें: प्रश्न टिप्पणी में जुड़ा हुआ कैसे बाहरी सॉफ्टवेयर के साथ समस्या को हल करने पर उदाहरण देता है, लेकिन मैं एक आंतरिक अजगर समाधान में दिलचस्पी रखता हूँ।

+0

@MartijnPieters वहाँ में और मुझे लगता है कि प्रयोग कर सकते हैं अच्छी जानकारी का एक बहुत कुछ नहीं है, लेकिन उन्हें सभी में पाइथन के समाधान _outside_ शामिल हैं, यानी कोड चलाने के बाद कोड को हाइलाइट करना। मैं कुछ आंतरिक करना चाहता हूं (मैं तदनुसार प्रश्न संपादित करूंगा)। – Hooked

+0

आपको अपने अपवाद हैंडलर को हुक करना होगा जो उसके बाद शायद पिक्सेल के माध्यम से ट्रेसबैक चलाएगा। –

+0

@MartijnPieters जो आपने अभी कहा है, संभवतः, मैं जो पूछ रहा हूं वह है। मुझे यकीन नहीं है कि मैं यह कैसे करूंगा। – Hooked

उत्तर

11

आप sys.excepthook handler के लिए एक कस्टम समारोह असाइन कर सकते हैं। जब भी अनचाहे अपवाद (इसलिए दुभाषिया से बाहर निकलने वाला) होता है तो फ़ंक्शन को कॉल किया जाता है।

import sys 

def myexcepthook(type, value, tb): 
    import traceback 
    from pygments import highlight 
    from pygments.lexers import get_lexer_by_name 
    from pygments.formatters import TerminalFormatter 

    tbtext = ''.join(traceback.format_exception(type, value, tb)) 
    lexer = get_lexer_by_name("pytb", stripall=True) 
    formatter = TerminalFormatter() 
    sys.stderr.write(highlight(tbtext, lexer, formatter)) 

sys.excepthook = myexcepthook 

इस संस्करण pygments library का उपयोग करता stderr करने के लिए इसे लिखने से पहले एक एएनएसआई रंग के साथ स्वरूपित में ट्रैस बैक पाठ परिवर्तित करने के लिए,।

+0

सटीक रूप से ट्रेसबैक के कौन से हिस्सों को हाइलाइट किया जाएगा, यह सब? – martineau

+0

@ मार्टिनौ: यह सब।आपको लेक्सर की कॉन्फ़िगरेशन को ट्विक करना होगा और/या जो कुछ भी आप पास करते हैं उसे कम चीजों को हाइलाइट करने के लिए बदलना होगा। –

+0

'पायगल्स' प्राप्त करने के लिए, मुझे बस किसी भी निर्देशिका से '$ easy_install पायगल्स 'करना था। –

2

colorama (या कोई अन्य रंग) मॉड्यूल देखें। तो फिर तुम लपेट कर सकते हैं के साथ पूरे एप्लिकेशन कर रहे हैं:

import traceback 
from colorama import Fore, init 
init() 

try: 
    // your app 
except Exception: 
    print Fore.RED + traceback.format_exc() + Fore.RESET 
    // possibly raise again or log to db 
+0

दिलचस्प, उत्तर के लिए धन्यवाद। क्या कोशिश करें कि "मेरा ऐप" बिना किसी प्रयास ब्लॉक में इंडेंट किया जा सके? – Hooked

+0

@ हुक किया मुझे ऐसा नहीं लगता है। लेकिन क्या यह एक समस्या है? अपने पूरे ऐप को फ़ंक्शन के अंदर रखें और फिर फ़ंक्शन को कॉल करें और 'ब्लॉक को छोड़कर' प्रयास करें। धागे शामिल होने पर भी यह अधिक जटिल हो सकता है। – freakish

+0

मार्टिजन पीटर के उत्तर में वर्णित अनुसार 'sys.excepthook' का उपयोग करके आप अपने पूरे ऐप के चारों ओर ब्लॉक को छोड़कर' कोशिश करें: 'को छोड़कर' संभवतः 'प्रयास कर सकते हैं। – martineau

2

एक और तरीका IPython मॉड्यूल जो संभावना एक निर्भरता है कि हर कोई पहले से ही स्थापित किया गया है का उपयोग कर यह करने के लिए मिल गया:

from IPython.core.ultratb import ColorTB 
c = ColorTB() 
exc = sys.exc_info() 
print(''.join(c.structured_traceback(*exc))) 
+0

स्ट्रिंग में मैन्युअल रूप से शामिल होने के बजाय 'ColorTB() टेक्स्ट (* exc) 'का उपयोग करना चाहिए क्योंकि यदि रंगीनबी' सादा 'के अलावा अन्य मोड में सेट है, मैन्युअल रूप से शामिल नहीं होगा। –