2017-05-25 7 views
5

Ich debugge eine große Python-Codebasis. Irgendwo druckt ein Stück Code {} zur Konsole, vermutlich ist das ein alter Fehlercode, der versehentlich hinterlassen wurde.Wie findet man eine falsche Druckanweisung?

Da dies die einzige Konsolenausgabe ist, die nicht durch Logger läuft, gibt es irgendeine Möglichkeit, den Schuldigen zu finden? Vielleicht, indem ich neu definiere, was die print-Anweisung macht, damit ich eine Ausnahme verursachen kann?

+1

Verwendung grep. Beispiel: 'grep -rnw '/ path/to/somewhere /' -e 'pattern''. Ref: https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing-specific-text-on-linux – Kajal

+1

Wenn alles andere durch eine Logger-Funktion geht, können Sie nicht einfach Suche nach 'print'? Wenn Sie eine anständige IDE verwenden, sollte es eine Möglichkeit geben, die gesamte Codebasis zu durchsuchen. – Barmar

+2

Suchen Sie nach allen 'print' Anweisungen, deaktivieren Sie die Hälfte, führen Sie sie erneut aus. Noch da? Deaktivieren Sie die andere Hälfte usw. –

Antwort

5

Versuchen Sie, sys.stdout zu benutzerdefinierten Stream-Handler umleiten (siehe Redirect stdout to a file in Python?), wo Sie überschreiben können write() -Methode.

versuchen, etwas wie folgt aus:

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') 

Dann werden Sie schöne Zurückverfolgungs erhalten:

λ 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

Genius - danke. – xorsyst

Verwandte Themen