繁体   English   中英

如何让 VS Code 将 Debug stdout 写入调试控制台?

[英]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 ):

tldr

两种解决方案:

  1. 将您的 vscode python 扩展降级到v2022.2.1924087327可以解决问题(或任何具有debugpy<=1.5.1的版本)。
    在此处输入图像描述

  2. 或者,从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}"} }
  3. 奖金 如果您使用的是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM