当我在另一个脚本导入的函数中设置断点时,我希望能够从 VS Code Python 调试控制台中查看父作用域中的变量。这可能吗,也许通过修改
launch.json
?
可重现的示例:
我有两个文件,
scratch_script.py
和scratch_function.py
。它们存在于同一目录中。
我在下面注释所示的位置放置了断点。
scratch_script.py
的内容:
import scratch_function
parent_scope_var = 'I disappear'
scratch_function.scratch_function() # breakpoint on this line
pass # breakpoint on this line
scratch_function.py
的内容:
def scratch_function():
child_scope_var = 'I appear'
pass # breakpoint on this line
我从
scratch_script.py
运行 VS Code Python 调试器。
在第一个断点处,我可以在 Python 调试控制台中查看
parent_scope_var
,但看不到 child_scope_var
。到目前为止一切顺利。
当我进行到第二个断点时,我可以查看
child_scope_var
,这很棒。但现在我无法查看parent_scope_var
:
NameError: name 'parent_scope_var' is not defined
在第三个断点上,在 Python 调试控制台中再次看到
parent_scope_var
,但没有看到 child_scope_var
...这正如我所期望的那样。
所以,我唯一的困惑是,为什么在被调用函数的断点处暂停时看不到
parent_scope_var
?变量仍然存在,对吗?就在父范围内?
是的,因为当你调试到第二个断点时,python 就会执行调用函数。此时,python将打开
scratch_function.py
文件。
第一个断点:
第二个断点:
它只会显示当前文件中存在的变量,而
parent_scope_var
文件中没有scratch_function.py
变量,python解释器找不到parent_scope_var
,因此手表面板提示错误:NameError: name 'parent_scope_var ' is not defined
。
但正如您可能猜到的那样,该变量此时仍然存在,就在
scratch_script.py
文件内。此时,你可以打开scratch_script.py
文件,将鼠标悬停在parent_scope_var
变量上,vscode会清晰地向你显示此时的变量值。
顺便说一句,您还可以在
CALL STACK面板中看到之前的
parent_scope_var
变量。
PS:调试时在代码文件中内联显示变量值的设置:
//file:settings.json
{
"debug.inlineValues": "on",
}
目前可以通过点击调用栈来切换不同的本地变量环境
您需要将
"justMyCode": false
添加到您的启动配置中。
这是我在调试 pytorch nn.Module 时要做的事情
另请参阅 vscode 调试编辑器 可以在运行和调试视图的变量部分或通过将鼠标悬停在编辑器中的源代码上来检查变量。变量值和表达式求值与 CALL STACK 部分中选定的堆栈帧相关。