Расшифровка большого потока программы в Python
Я нахожусь в процессе изучения того, как создается большая (из 356 файлов) запутанная программа Python. Помимо ручного чтения и анализа кода, есть ли хорошие методы для отслеживания выполнения программы?
Есть два метода, которые я считаю полезными:
- Нечто похожее на "set -x" Баша
- То, что отображает, какой файл выводит каждую строку вывода
Существуют ли какие-либо методы, описанные выше, или какие-либо другие способы, которые вы считаете полезными?
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 также делают подобные вещи.