Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在哪里检索<;文件名>;来自的回溯输入字段_Python_Intercept_Traceback - Fatal编程技术网

Python在哪里检索<;文件名>;来自的回溯输入字段

Python在哪里检索<;文件名>;来自的回溯输入字段,python,intercept,traceback,Python,Intercept,Traceback,每个回溯项的格式如下: File "<filename>", line xxx, in <module> line 文件“”,第xxx行,在 线 我对更改某些模块的文件名字段(自定义)感兴趣。这可能吗?我已经尝试过修改模块对象的\uuuu file\uuuuuuuu成员,但在python生成回溯堆栈时似乎没有使用它。您可以使用检查模块来获取许多模块的文件路径。e、 g >>> inspect.getabsfile(traceback) '/u

每个回溯项的格式如下:

File "<filename>", line xxx, in <module>
    line
文件“”,第xxx行,在
线

我对更改某些模块的文件名字段(自定义)感兴趣。这可能吗?我已经尝试过修改模块对象的
\uuuu file\uuuuuuuu
成员,但在python生成回溯堆栈时似乎没有使用它。

您可以使用
检查
模块来获取许多模块的文件路径。e、 g

>>> inspect.getabsfile(traceback)
'/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/traceback.py'
知道了回溯的来源,我们可以查看
print\u stack()
的定义:


有了“where is defined?”这句话,我将为您省去跟踪函数调用的麻烦,并建议查看和。在不知道具体要如何处理回溯的情况下,我建议查看,因为它会造成相当多的回溯损坏。

打印此行的代码在CPython的代码中,在traceback.c的函数
tb\u displayline()
中:

调用堆栈易于遵循:

PyTraceBack\u Print()
→ <代码>tb_printinternal()→ <代码>tb\U displayline()

查看这些函数的代码,如果不修改CPython的源代码,就不可能从解释器中修改代码帧对象。此外,代码框的
co_filename
属性定义为只读:

对于信息,将从两个位置调用
PyTraceBack\u Print()

  • 从Python/pythonrun.c中的
    print\u exception()
  • 从Python/errors.c中的
    write_unraisable_exc_file()
因此,无法修改从文件导入的模块的文件名,因为在这种情况下,加载程序是
SourceFileLoader
,不允许修改文件名。
SourceFileLoader
的源代码可在以下位置获得:

内置模块是特殊情况:因为它们是在CPython解释器中用C实现的,所以它们在
co_filename
字段中设置了
“内置”
。在这里完成:

但不幸的是,无法为已导入的模块设置任意名称


甚至不希望替换源文件路径,因为如果没有来自回溯的源文件路径,调试将更加困难。

看起来您已经找到了它,它甚至是公认的答案,但根本不是这样。看看我发布的答案不管它看起来怎么样,
traceback
模块实际上并不是CPython用来打印回溯的。这是一个Python级别的功能重新实现,有细微的区别。除非
而不是真正的文件路径(当代码在stdin上提供时),不希望替换源文件路径,因为如果没有来自回溯的源文件路径,调试将更加困难。我知道这是一个老问题,但它应该得到一个正确的更新(3.9)答案。
279 def print_stack(f=None, limit=None, file=None):
280     """Print a stack trace from its invocation point.
281
282     The optional 'f' argument can be used to specify an alternate
283     stack frame at which to start. The optional 'limit' and 'file'
284     arguments have the same meaning as for print_exception().
285     """
286     print_list(extract_stack(_get_stack(f), limit=limit), file=file)