如何在epydoc加载我的代码时获取堆栈跟踪?

1 投票
1 回答
554 浏览
提问于 2025-04-15 18:21

当我把我的代码加载到 epydoc 中,并且只加载顶层模块时,它失败了,出现了:

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

这里提到的 NoneType 是我在第9行尝试加载的一个子模块。请问我怎么才能让 epydoc 告诉我为什么它无法加载第9行的模块,而不是直接继续执行然后出错呢?

根据 nosko 的要求,这里有一个类似的例子,但没有给出堆栈跟踪信息:

# 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

结果却是没什么用的:

    +--------------------------------------
    | In /home/ross/foo.py:
    | Import failed (but source code parsing was successful).
    |     Error: KeyError: 'DOES_NOT_EXIST' (line 1)
我希望 epydoc 能告诉我失败发生在 bar.py 的第6行。我不想让它抱怨 foo.py 导入 bar.py 的问题。我无法在一个小例子中重现我具体的问题,但我基本的请求是,当 epydoc 失败时,我希望它能打印出堆栈跟踪,以指向问题所在。不管是加载子模块还是在字典中找不到某个键。

注意:这个问题的根源在于我尝试记录的代码是 SCons 的输入,它有不同的环境设置问题。这就是为什么当我在 epydoc 中运行时它不工作,但当我用 scons -f SConstruct.py 运行时脚本仍然能正常工作。我还在尝试用 sphinx 生成文档。当我用 sphinx 运行时,它实际上会显示堆栈跟踪。也许我会选择 sphinx...

1 个回答

2

所以如果我理解得没错,你正在用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也被分析了,所以这个文件中出错的行号会被列出来。

现在,如果你想要一个更稳妥的解决方案,因为这是你常常需要处理的问题,那你就得开始研究epydoc的内部结构。根据我的经验,我建议你如果能的话,尽量避免走这条路。如果可以选择切换到Sphinx,我会推荐这个方向。

撰写回答