我正在try 用VS代码调试Python Pytest测试,使用左栏上的测试活动.我能够按照预期运行测试,有些通过,有些失败.我想调试失败的测试,以更准确地确定导致失败的原因.

当我在调试模式下运行单个测试时,VS代码正确地命中断点并停止,并且运行和调试窗格显示了局部变量.我可以在变量中观察局部变量的状态>本地窗格或通过REPL,键入变量的名称.

当我试图打印任何语句时,例如使用> print("here"),我不会得到任何输出到调试控制台.当我引用一个变量,或者直接使用> "here"放置字符串时,我确实看到了调试控制台的输出.

在我看来,REPL的stdout没有显示在调试控制台上.许多在线答案都建议增加"redirectOutput": true"console": "integratedTerminal"这样的选项,但这两个选项似乎都不起作用.下面是我的全部简历:

{
    // 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作为我):

tladr

两种解决方案:

  1. downgrade your vscode python extension to v2022.2.1924087327 that will do the trick (or any version that had the debugpy<=1.5.1).
    enter image description here

  2. 或者,从debug tab而不是testing tab启动debbuger.并使用如下配置

    {
        "name": "Python: Current File (Integrated Terminal)",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "console": "integratedTerminal",
        "purpose": ["debug-test"], 
        "redirectOutput": true,
        "env": {"PYTHONPATH": "${workspaceRoot}"}
    }
    
  3. Bonus.如果你使用pytest,你可以暂时禁用capture of the stdout of 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')
    

the long explanation

因此,问题显然是,在上一个版本v1.6.0中,debugpy(vscode python调试器使用的库)修复了"bug (827)".简而言之,这个"错误"是vscode在调试时"复制"了所有标准输出,因为它捕获了pytest stdout并在调试器控制台中复制它.

在"修复"了这个问题之后,问题是当通过testing tab启动测试时,默认情况下,pytest正在捕获所有stdout,而"新"(>=v1.6.1)debugpy忽略了它.因此,即使在断点中调用print(),所有的打印语句也不再显示在调试控制台上,因为它是由pytest捕获的(IDK,其中pytest个捕获的stdout正在显示/存储,如果它在任何地方).在我看来,这就是皮塔.

在控制台中启动pytest时,甚至可以将调试选项卡作为自定义配置,使用标志-s--capture=no禁用pytest捕获选项.但问题是,在testing tab的vscode中添加这些参数需要no way (apparently)个,所以pytest是使用该选项执行的.

因此,我找到的解决方案是将python扩展降级为使用旧版本debugpy v1.5.1的版本,您可以在python extension更改日志(log)中看到,从版本2022.4.0开始,他们更新了debugpy版本,所以在这之前,我做了一些技巧,您将在控制台中有双stdout"bug",但print语句将起作用.

参考: bootstrap 我找到解决方案的issue

Python相关问答推荐

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

Pandas 在时间序列中设定频率

按照行主要蛇扫描顺序对点列表进行排序

jit JAX函数中的迭代器

在Pandas 日历中插入一行

如何根据日期和时间将状态更新为已过期或活动?

仿制药的类型铸造

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

无法定位元素错误404

PyQt5,如何使每个对象的 colored颜色 不同?'

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

部分视图的DataFrame

如何使用OpenGL使球体遵循Python中的八样路径?

使用Openpyxl从Excel中的折线图更改图表样式

通过追加列表以极向聚合

Pandas—堆栈多索引头,但不包括第一列

将一个双框爆炸到另一个双框的范围内

Python pint将1/华氏度转换为1/摄氏度°°

删除Dataframe中的第一个空白行并重新索引列

对数据帧进行分组,并按组间等概率抽样n行