[英]How do you get VS Code to write Debug stdout to the Debug Console?
我正在尝试使用左侧栏中的测试活动在 VS Code 中调试我的 Python Pytest 测试。 我能够按预期运行我的测试,有些通过,有些失败。 我想调试失败的测试以更准确地确定导致失败的原因。
当我在调试模式下运行单个测试时,VS Code 正确地到达断点并停止,并且“运行和调试”窗格显示局部变量。 我可以在“变量”>“局部”窗格中或通过 REPL,通过键入变量的名称来观察局部变量的状态。
当我尝试打印出任何语句时,例如使用> print("here")
我没有得到任何输出到调试控制台。 当我引用一个变量,或者直接使用> "here"
放置字符串时,我确实看到了调试控制台的输出。
在我看来,我的 REPL 的标准输出没有显示到调试控制台。 网上的许多答案都建议添加诸如"redirectOutput": true
或"console": "integratedTerminal"
类的选项,但这些选项似乎都没有奏效。 我的完整launch.json
如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"debugOptions": [
"WaitOnAbnormalExit",
"WaitOnNormalExit"
],
"console": "integratedTerminal",
"stopOnEntry": false,
"redirectOutput": true,
"outputCapture": "std"
}
]
}
我是否缺少另一个设置来启用此输出? 我有错误的控制台类型吗?
所以在经历了很多令人沮丧的“调试”之后,我找到了一个对我有用的解决方案(如果你像我一样使用pytest
):
两种解决方案:
将您的 vscode python 扩展降级到v2022.2.1924087327
可以解决问题(或任何具有debugpy<=1.5.1
的版本)。
或者,从debug tab
而不是testing tab
启动调试器。 并使用如下配置
{ "name": "Python: Current File (Integrated Terminal)", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "purpose": ["debug-test"], "redirectOutput": true, "env": {"PYTHONPATH": "${workspaceRoot}"} }
奖金。 如果您使用的是pytest
,您可以暂时禁用对 pytest 的标准输出的捕获,以便您的打印语句和print
功能,*如果您在contextmanager
中设置断点,也可以工作。 这非常麻烦,但指出了为什么打印不再工作的原始问题。
def test_disabling_capturing(capsys): print('this output is captured') with capsys.disabled(): print('output not captured, going directly to sys.stdout') print('this output is also captured')
所以问题显然是debugpy
(这是vscode
python调试器使用的库)是最新版本v1.6.0
修复了这个“bug(827)” 。 简而言之,这个“错误”是 vscode 在调试时“复制”了所有标准输出,因为它捕获了pytest
stdout
并将其复制到调试器控制台中。 这是因为,默认情况下, pytest
捕获所有标准输出并将其存储(因此在并行运行所有测试时不会造成混乱)。
在“修复”这个问题之后,现在,当您通过testing tab
启动测试时,默认情况下, pytest
会捕获所有stdout
,而“新”( >=v1.6.1
debugpy
忽略它。 因此,调试控制台上不再显示所有打印语句,即使您在断点中调用print()
也是如此,因为它们被 pytest 捕获(如果它在任何地方,则显示/存储pytest
捕获的标准输出的 IDK)。 就我而言,这是一个 PITA。
您可以使用标志-s
或--capture=no
在控制台中启动 pytest 或什至从调试选项卡作为自定义配置来禁用pytest
捕获选项。 但问题是(显然)无法在 vscode 中为testing tab
添加这些参数,因此使用该选项执行 pytest。
因此,我找到的解决方案是将 python 扩展降级到使用旧版本debugpy
v1.5.1
的版本,您可以在python 扩展更改日志中看到,他们从2022.4.0
版本更新了debugpy
版本,所以之前这对我有用,您将在控制台中有双重stdout
“错误”,但print
语句将起作用。
参考:导致我解决问题的问题
您可以在 debugpy 问题中听到您的声音,以鼓励修复它: https ://github.com/microsoft/debugpy/issues/947
我在网上看到的一种可能的解决方法是将 Spark 中的 DF 打印为字符串,然后将其粘贴到 Notepad++ 中并将 \n 值转换为换行符。
我能够使用在另一个 Stack Overflow 答案中找到的一些代码将 DF 打印到字符串中:
def getShowString(df, n=20, truncate=True, vertical=False):
if isinstance(truncate, bool) and truncate:
return(df._jdf.showString(n, 20, vertical))
else:
return(df._jdf.showString(n, int(truncate), vertical))
然后可以使用getShowString(df)
调用它
这并不能解决将终端输出定向到调试窗口的实际问题,但在这种特殊情况下会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.