首页 > 解决方案 > 在 VSCode 中,Python 调试器每次调试时都会启动一个新终端

问题描述

在 Python 中调试时,在 VS Code 中,每次调试时都会创建一个新终端。代码只是每次都在终端窗口的下拉列表中添加一个终端。我必须手动删除每个终端,或者在一段时间后删除其中的一堆——否则代码最终会挂起。

是否有一个选项设置来阻止这个?是预期的行为还是缺陷?


更新:这是每次创建新调试终端时发生的情况的屏幕截图。这是终端窗口右侧的下拉菜单,您可以使用它打开或访问ctrl-`(坟墓键、非移动波浪号或 ~ 键)。它显示了普通的bash终端,每次运行脚本时都会重复使用的Python终端,但有 3 个Python 调试控制台窗口。每次调试时都会创建一个新的Python 调试控制台F5( )。所以我每次调试时都需要进去手动删除一个Python Debug Console(点击右边的垃圾桶图标)。在我意识到它正在发生之前,这已经打开了多达 20 多个终端窗口。

在此处输入图像描述

标签: pythonvisual-studio-codevscode-debugger

解决方案


更新(~9/2021):

最新版本的 VS Code(~v1.60 及更高版本)重新设计了一些核心测试基础设施,这可能不是什么大问题。但是,我仍然偶尔会遇到它。

即使没有以下内容,通常也有效的一件事似乎是避免“重新启动调试”按钮。如果您只是停止调试会话然后重新启动,但是您首先启动它,我很少得到多个会话窗口。

一个真正的解决方案:让终端之后退出!

终于在这个答案中看到了一个真正的解决方案(好吧,有点hacky)- 至少如果你使用Git Bash作为你的默认终端。

如果您添加参数&&exit调试配置,调试终端将在您的程序结束后自动退出。但请注意,它会立即关闭终端以及其中的所有文本(您可能需要在脚本末尾添加“按任意键结束程序”,以便您有时间查看任何文本,或类似那)。

注意:这仍然是一个 hack,它并不总是有效 - 如果您点击调试器工具栏上的“重新启动”或“停止”按钮,它将缩短此方法

基本上告诉 Bash在&&继续执行其他命令之前停止并等待调试任务完成,然后在exit调试会话结束后执行,这将关闭终端。

您可以通过打开运行/调试配置来执行此操作,如下所示:

  1. 转到边栏中的“运行”窗口
  2. 在下拉列表中选择运行配置,然后按齿轮,这将launch.json在编辑器窗口中显示相应的文件。

在此处输入图像描述

  1. 添加args: ["&&", "exit"]如下所示的行,并确保在上一行的末尾添加一个逗号!!

启动.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}",
            "console": "integratedTerminal",
            "args": ["&&", "exit"]
        }
    ]
}

注意 1:"args": ["\n", "exit", "0"]该答案留下的评论表明如果这不起作用,您可能想尝试。这可能适用于不同的终端类型(Windows Cmd Prompt、PowerShell、不同的 Linux shell 等)。

注意 2:如果您需要添加其他参数,可以将它们作为字符串添加到列表中的“&&”参数之前。列表中较早放置的项目将成为您实际程序/脚本的参数。



替代(原始)解决方案:使用调试控制台进行输出

经过一番搜索,我无法确定是否为每次调试启动一个新终端是预期的行为,但有一种解决方法。

为Python设置调试配置:当前文件。在调试选项卡的顶部,单击齿轮图标以打开launch.json

注意: 下面的调试图标略有更改,现在调用此选项卡Run而不是Debug

在此处输入图像描述

launch.json中,将"console"设置从默认更改"integratedTerminal""internalConsole",如下所示:

{   "version": "0.2.0",
    "configurations": [
        {   "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "internalConsole"
        }
    ]
}

这将导致任何调试会话的所有输出仅发生在 DEBUG CONSOLE 中,每个会话都会被清除和重用,而不是在每个会话中生成一个新的集成终端。


不足之处

我最终回到集成终端,寻找需要用户在控制台输入的脚本,因为调试控制台不允许用户输入。

在这种情况下,您只需要不断删除额外的调试会话 - 有点痛苦。


推荐阅读