Расшифровка большого потока программы в Python

Я нахожусь в процессе изучения того, как создается большая (из 356 файлов) запутанная программа Python. Помимо ручного чтения и анализа кода, есть ли хорошие методы для отслеживания выполнения программы?

Есть два метода, которые я считаю полезными:

  1. Нечто похожее на "set -x" Баша
  2. То, что отображает, какой файл выводит каждую строку вывода

Существуют ли какие-либо методы, описанные выше, или какие-либо другие способы, которые вы считаете полезными?

4 ответа

Решение

Я не знаю, действительно ли это хорошая идея, но так как я написал хук для отображения файла и строки перед каждой строкой вывода в stdout, я мог бы также дать ее вам…

import inspect, sys

class WrapStdout(object):
    _stdout = sys.stdout
    def write(self, buf):
        frame = sys._getframe(1)
        try:
            f = inspect.getsourcefile(frame)
        except TypeError:
            f = 'unknown'
        l = frame.f_lineno
        self._stdout.write('{}:{}:{}'.format(f, l, buf))
    def flush(self):
        self._stdout.flush()

sys.stdout = WrapStdout()

Просто сохраните это как модуль, и после вас import это, каждый кусок stdout будет иметь префикс файла и номер строки.

Конечно, это будет ужасно, если:

  • Любой пытается напечатать частичные строки (используя stdout.write напрямую или print волшебная запятая в 2.x, или end='' в 3.х).
  • Вы смешиваете Unicode и не Unicode в 2.x.
  • Любые из исходных файлов имеют длинные пути.
  • и т.п.

Но все хитрые биты глубокой Python-магии есть; Вы можете построить его довольно легко.

Это может быть очень утомительно, но, используя отладчик для отслеживания потока выполнения, инструкция за инструкцией, вероятно, может помочь вам в некоторой степени.

import pdb
pdb.set_trace()

Вы можете найти программу перекрестных ссылок. Есть старая программа, называемая pyxr, которая делает это. Цель перекрестной ссылки - дать вам знать, как классы относятся друг к другу. Некоторые из IDE также делают подобные вещи.

Я бы порекомендовал запустить программу внутри IDE, например, pydev или pycharm. Возможность остановить программу и проверить ее состояние может быть очень полезной.

Другие вопросы по тегам