Есть ли уловка для печати на встроенной печати с помощью pdb?

В принципе, название.

Я пытаюсь отслеживать, где ложная печать происходит в большой базе кода, и я хотел бы сломать или как-то получить трассировку стека всякий раз, когда печать «происходит». Есть идеи?

  • эквивалент e.printStackTrace в python
  • Как включить stacktrace в мою страницу Django 500.html?
  • Получение трассировки python без исключения
  • 2 Solutions collect form web for “Есть ли уловка для печати на встроенной печати с помощью pdb?”

    В этом конкретном случае вы можете перенаправить stdout на вспомогательный класс, который печатает вывод и его вызывающий. Вы также можете разбить один из его методов.

    Полный пример:

     import sys import inspect class PrintSnooper: def __init__(self, stdout): self.stdout = stdout def caller(self): return inspect.stack()[2][3] def write(self, s): self.stdout.write("printed by %s: " % self.caller()) self.stdout.write(s) self.stdout.write("\n") def test(): print 'hello from test' def main(): # redirect stdout to a helper class. sys.stdout = PrintSnooper(sys.stdout) print 'hello from main' test() if __name__ == '__main__': main() 

    Вывод:

     printed by main: hello from main printed by main: printed by test: hello from test printed by test: 

    Вы также можете просто распечатать inspect.stack() если вам нужна более подробная информация.

    Единственным тонким, о котором я могу думать, было бы заменить sys.stdout , например, с помощью streamwriter, возвращаемого codecs.getwriter('utf8') . Затем вы можете установить точку останова на свой метод write в pdb. Или замените его методом write на код отладки.

     import codecs import sys writer = codecs.getwriter('utf-8')(sys.stdout) # sys.stdout.detach() in python3 old_write = writer.write def write(data): print >>sys.stderr, 'debug:', repr(data) # or check data + pdb.set_trace() old_write(data) writer.write = write sys.stdout = writer print 'spam', 'eggs' 
    Python - лучший язык программирования в мире.