Как получить трассировку стека из epydoc при загрузке моего кода?

Когда я загружаю свой код в epydoc и просто загрузите верхний модуль, с которым не получается:

Error: TypeError: 'NoneType' object is not callable (line 10)

Где то NoneType он ссылается на подмодуль, который я пытался загрузить в строке 9. Как я могу получить epydoc, чтобы объяснить, почему он не может загрузить модуль в строке 9 вместо того, чтобы просто пахать вперед и выдавать ошибку?

По просьбе Носко. Вот аналогичный пример, где не дается трассировка стека:

# foo.py
import bar
bar.baz()

# bar.py

def baz():
    print 'baz'

import os
os.environ['DOES_NOT_EXIST']

Бежать с:

python2.6 epydoc --html foo.py

Производит менее чем полезное:

    + --------------------------------------
    | В /home/ross/foo.py:
    | Не удалось импортировать (но разбор исходного кода прошел успешно).
    | Ошибка: KeyError: 'DOES_NOT_EXIST' (строка 1)
Я хочу, чтобы epydoc сообщил мне, что ошибка находится на 6-й строке bar.py, Я не хочу жаловаться foo.py ввоз bar.py, Я не могу воспроизвести мою конкретную проблему в небольшом примере, но мой основной запрос заключается в том, чтобы при сбое epydoc я хотел, чтобы он напечатал трассировку стека, чтобы указать на проблему. Будь то загрузка субмодуля или вызов не найдя ключ в словаре.

ПРИМЕЧАНИЕ. Корень этой проблемы заключается в том, что код, который я пытаюсь задокументировать, является входом для SCons, у которого есть различные проблемы с настройкой среды. Вот почему, когда я бегу в epydoc это не работает, но скрипт все еще работает при запуске с scons -f SConstruct.py, Я также пытаюсь сгенерировать документацию с sphinx, Когда я бегу с sphinx это фактически показывает трассировку стека. Может быть, я пойду с sphinx...

1 ответ

Решение

Так что, если я правильно понимаю, модуль, на котором вы запускаете epydoc, импортирует модуль с ошибкой (а не модуль, для которого вы хотите сгенерировать документацию)?

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

Итак, работает:

epydoc --check foo.py bar.py

Будет выводить:

+------------------------------------------------------------------------------------------------------------
| In /home/mark/Desktop/foo.py:
| Import failed (but source code parsing was successful).
|     Error: KeyError: 'DOES_NOT_EXIST' (line 2)
|   
+------------------------------------------------------------------------------------------------------------
| In /home/mark/Desktop/bar.py:
| Import failed (but source code parsing was successful).
|     Error: KeyError: 'DOES_NOT_EXIST' (line 7)
|   

Поскольку Bar.py также анализируется, указывается номер строки, в которой произошла ошибка в этом файле.

Теперь, если вы ищете более надежное решение, потому что это распространенная проблема, с которой вам нужно разобраться, вам придется начинать взламывать внутренности эпидока. Сделав это сам, я бы посоветовал вам не бежать по этой кроличьей норе, если можете. Если вы хотите переключиться на Sphinx, я бы рекомендовал этот маршрут.

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