2014-06-26 2 views
13

मैं वर्तमान में पाइथन में काफी जटिल प्रणाली का निर्माण कर रहा हूं, और जब मैं डिबगिंग कर रहा हूं तो मैं अक्सर कई स्क्रिप्ट में सरल प्रिंट स्टेटमेंट डालता हूं। एक सिंहावलोकन रखने के लिए मैं अक्सर फ़ाइल नाम और लाइन नंबर मुद्रित करना चाहता हूं जहां प्रिंट स्टेटमेंट स्थित है। मैं निश्चित रूप से मैन्युअल रूप से ऐसा कर सकते हैं, या कुछ इस तरह के साथ:पायथन डीबगिंग: फ़ाइल नाम और लाइन नंबर प्राप्त करें जिससे एक फ़ंक्शन कहा जाता है?

from inspect import currentframe, getframeinfo 
print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', 'what I actually want to print out here' 

जो की तरह कुछ प्रिंट:

filenameX.py:273 - क्या मैं वास्तव में यहाँ

बाहर प्रिंट करना चाहते हैं

इसे और अधिक आसान बनाने के लिए, मैं की तरह कुछ करने के लिए सक्षम होना चाहते हैं:

print debuginfo(), 'what I actually want to print out here' 

तो मैं कहीं एक समारोह में डाल दिया और कर की कोशिश की:

from debugutil import debuginfo 
print debuginfo(), 'what I actually want to print out here' 
print debuginfo(), 'and something else here' 

दुर्भाग्य से, मैं:

debugutil.py:3 - what I actually want to print out here 
debugutil.py:3 - and something else here 

यह, फ़ाइल नाम और लाइन नंबर है जिस पर मैं समारोह परिभाषित बाहर प्रिंट के बजाय जिस लाइन पर मैं debuginfo() को कॉल करता हूं। यह स्पष्ट है, क्योंकि कोड debugutil.py फ़ाइल में स्थित है।

तो मेरा प्रश्न वास्तव में है: मैं फ़ाइल नाम और लाइन नंबर कैसे प्राप्त कर सकता हूं जिससे यह debuginfo() फ़ंक्शन कहा जाता है? सभी सुझावों का स्वागत है!

+0

उपयोग 'लॉगिंग' मॉड्यूल और फॉर्मेटर को कॉन्फ़िगर करें: https://docs.python.org/2/library/logging.html#logrecord-attributes। टॉरनाडो वेब फ्रेमवर्क में वास्तव में एक प्रारूप बहुत समान है, इसलिए आप शायद उनके कोड का उपयोग कर सकते हैं: http://tornado.readthedocs.org/en/latest/_modules/tornado/log.html#LogFormatter – Blender

उत्तर

26

समारोह inspect.stack()frame records की एक सूची देता है, फोन करने वाले के साथ शुरू और बाहर जाने, जो आपको इच्छित जानकारी प्राप्त करने के लिए उपयोग कर सकते हैं:

from inspect import getframeinfo, stack 

def debuginfo(message): 
    caller = getframeinfo(stack()[1][0]) 
    print "%s:%d - %s" % (caller.filename, caller.lineno, message) 

def grr(arg): 
    debuginfo(arg) 

grr("aargh") 

आउटपुट:

example.py:8 - aargh 
+0

ठीक है, यह अच्छा है। –

+0

आपकी मदद के लिए धन्यवाद! मैं इसे हर परियोजना में बहुत अधिक उपयोग करने जा रहा हूं जिस पर मैं काम कर रहा हूं! महोदय, महोदय, मैंने अपना जीवन इतना आसान बनाया कि अब मैं आधिकारिक तौर पर इसे "कमाल" कह सकता हूं! – kramer65

+0

यह बहुत अच्छा है! Django में एक समारोह था जो मैं यह पता लगाने में सक्षम नहीं था कि इसे कहां से बुलाया जा रहा था। – Sankalp

0

बस कोड आप एक समारोह में तैनात कर दिया:

from inspect import currentframe, getframeinfo 

def my_custom_debuginfo(message): 
    print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', message 

और फिर इसका इस्तेमाल के रूप में आप चाहते हैं:

# ... some code here ... 
my_custom_debuginfo('what I actually want to print out here') 
# ... more code ... 

मैं आपको एक अलग मॉड्यूल में है कि समारोह डाल की सलाह देते हैं, इस तरह आप जब भी आपको इसकी आवश्यकता हो, इसे पुन: उपयोग कर सकते हैं।

+0

यही वह है जो मैंने पहले ही किया है , और फिर यह उस मॉड्यूल के फ़ाइल नाम और लाइन नंबर को प्रिंट करता है जिसमें फ़ंक्शन है, जहां मैं फ़ंक्शन को कॉल नहीं करता हूं। कोई अन्य विचार? – kramer65

संबंधित मुद्दे