考虑以下verysimple.py
:
if '__main__' == __name__:
prnt('Line1')
现在,如果我用> python verysimple.py
执行它,我当然会受到以下的欢迎:
Traceback (most recent call last):
File "verysimple.py", line 2, in <module>
prnt('Line1')
NameError: name 'prnt' is not defined`
我想知道Python在python-c-api中从何处提取回溯信息(尤其是错误的命令)。你知道吗
我已经试着在PyEval_FrameEx
里面找到我的路,但是想不出来。。。你知道吗
你在正确的轨道上。解析代码树时,它只需多次遍历
PyEval_FrameEx
。 最后,它将调用format_exc_check_arg()
来格式化错误,这对我来说发生在pythonversion3.3.2源代码的ceval.c
的第2100行。format_exc_check_arg()
推导出攻击性的“object”(prnt
),并调用errors.c
中的PyErr_Format
,以正确格式化异常字符串(异常类型及其对应的字符串NAME_ERROR_MSG
,已经从此行2100传递给format_exc_check_arg()
。你知道吗我只是使用以下代码进行测试:
然后通过我周围的python3.3的debug build运行它。你知道吗
PyEval_FrameEx
中的周围代码是请注意,上面的两行
PyDict_GetItem(...)
将是试图在内置语句和函数中查找prnt
的行(我从应用w
的f->builtins
中推断出来,w
本身是从上述代码中的第二条语句中获得的。 由于字典查找将失败,x == NULL
和NameError
被设置并格式化。你知道吗希望这能帮助你更进一步。你知道吗
相关问题 更多 >
编程相关推荐