2014-01-03 9 views
2

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

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

  1. что-то похожее на Bash в «установить -x»
  2. Что-то, что показывает выходы, какой файл каждая строка вывода

ли есть ли какие-либо способы сделать это выше или какие-либо другие способы, которые вы нашли полезными?

+1

Вы можете просто запустить его через отладчик в пошаговом режиме, проверить pdb http://docs.python.org/2/library/pdb.html –

+0

Есть также несколько приятных интерактивных визуализаторов, таких как [этот онлайн ] (http://pythontutor.com/visualize.html#). Не так хорошо, как отладчики для «теперь, когда я нахожусь в этой точке останова, позвольте мне оценить некоторые произвольные выражения», но намного лучше получить быстрый обзор потока. – abarnert

ответ

1

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

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.x).
  • Вы смешиваете Unicode и не-Unicode в 2.x.
  • Любой из исходных файлов имеет длинные пути.
  • т.д.

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

+1

Спасибо. В конце концов мне пришлось перекопать два слоя перенаправления вывода, чтобы вставить этот код, где ему нужно действительно на самом деле быть полезным =/(каждая строка выводит, что он поступает из того же файла/lineno) –

+0

@RossAiken: Вероятно, я должен был объяснить, что делает '_getframe', и как я знал, что нужно использовать' 1', и почему вам, возможно, придется использовать '2', и как работать с уже перенаправленным stdout и т. Д., вместо того, чтобы сбрасывать быстрый хак, который работал для меня в одной конкретной ситуации отладки и надеялся, что вы сможете это понять ... Но похоже, что мне повезло, и вы уже знали, как бороться со всем, что появилось, так что это было полезно в конце концов , – abarnert

0

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

1

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

import pdb 
pdb.set_trace() 
0

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

 Смежные вопросы

  • Нет связанных вопросов^_^