2017-05-25 9 views
5

मैं एक बड़ा पायथन कोडबेस डिबग कर रहा हूं। कहीं, कोड का एक टुकड़ा कंसोल के लिए {} प्रिंट कर रहा है, संभवतः यह कुछ पुराना डिबगिंग कोड है जिसे दुर्घटना में छोड़ दिया गया है।एक नकली प्रिंट स्टेटमेंट कैसे ढूंढें?

चूंकि यह एकमात्र कंसोल आउटपुट है जो लॉगर के माध्यम से नहीं जाता है, क्या मैं अपराधी को ढूंढ सकता हूं? शायद प्रिंट स्टेटमेंट क्या करता है इसे फिर से परिभाषित करके, इसलिए मैं अपवाद का कारण बन सकता हूं?

+1

उपयोग ग्रेप:

import io import sys import traceback class TestableIO(io.BytesIO): def __init__(self, old_stream, initial_bytes=None): super(TestableIO, self).__init__(initial_bytes) self.old_stream = old_stream def write(self, bytes): if 'bb' in bytes: traceback.print_stack(file=self.old_stream) self.old_stream.write(bytes) sys.stdout = TestableIO(sys.stdout) sys.stderr = TestableIO(sys.stderr) print('aa') print('bb') print('cc') 

तो फिर तुम अच्छा ट्रैस बैक मिल जाएगा। उदाहरण: 'grep -rnw'/पथ/से/कहीं/'-e' पैटर्न''। रेफरी: https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing- विशिष्ट-text-on-linux – Kajal

+1

यदि सब कुछ लॉगर फ़ंक्शन के माध्यम से जाता है, तो क्या आप बस 'प्रिंट' के लिए खोजें? यदि आप एक सभ्य आईडीई का उपयोग कर रहे हैं, तो इसमें पूरे कोडबेस को खोजने का एक तरीका होना चाहिए। – Barmar

+2

सभी 'प्रिंट' कथनों के लिए खोजें, उनमें से आधा अक्षम करें, पुनः चलाएं। अभी तक वहीँ? अन्य आधे, आदि को अक्षम करें –

उत्तर

5

कस्टम स्ट्रीम हैंडलर पर sys.stdout को रीडायरेक्ट करने का प्रयास करें (Redirect stdout to a file in Python? देखें), जहां आप लिखने() विधि को ओवरराइड कर सकते हैं। इस तरह

कोशिश कुछ:

λ python test.py 
aa 
    File "test.py", line 22, in <module> 
    print('bb') 
    File "test.py", line 14, in write 
    traceback.print_stack(file=self.old_stream) 
bb 
cc 
+0

जीनियस - धन्यवाद। – xorsyst

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