在VSCode中,每次我调试Python时都会启动一个新的终端。

6
当在VS Code中进行Python调试时,每次调试都会创建一个新的终端。代码会不断向终端窗口的下拉列表中添加终端。我必须手动删除每个终端,或者在一段时间后删除一堆终端 - 否则Code最终会挂起。是否有选项设置可以停止这种行为?这是预期行为还是缺陷?
更新: 这是每次创建新的调试终端时发生的情况截图。这是终端窗口右侧的下拉菜单,您可以使用ctrl-`(重音符键,非换挡波浪线或~键)打开或转到该菜单。它显示普通的bash终端、每次运行脚本时都会被重用的Python终端,以及3个Python调试控制台窗口。每次调试(F5)都会创建一个新的Python调试控制台。因此,我需要手动删除一个Python调试控制台(点击右侧的垃圾桶图标)每次进行调试。在意识到这一点之前,这种情况已经导致20多个终端窗口打开。

enter image description here


  1. 在 Python 代码上右键单击
  2. 单击“在终端中运行 Python 文件” 您可以在键盘快捷键首选项中分配快捷键。
- Gobrisebane
嗨 @Gobrisebane - 这只会运行文件,而不会启动调试器(即菜单:运行 -> 开始调试)。 - LightCC
相关链接:https://github.com/microsoft/debugpy/issues/132 - starball
1个回答

14

更新(~9/2021):

最近的VS Code版本(~v1.60及更高版本)已经重新设计了一些核心测试基础设施,这可能不再是一个大问题。然而,我偶尔还是会遇到这个问题。

有一件事情通常可以解决这个问题,即使没有下面的方法,那就是避免使用“重新启动调试”按钮。如果你只是停止调试会话,然后以最初的方式重新启动,我很少会出现多个会话窗口。

注意:Git Bash的问题

当启动调试器时,我也遇到了Git Bash的间歇性问题。经过一些研究发现,Git Bash不能保证与VS Code完全兼容,并且在来回通信时有时会丢失字符。

将默认终端切换为命令提示符或PowerShell似乎可以解决这个问题。我还没有找到一种指定调试使用哪个终端的方法。


一个真正的解决方案:在程序结束后让终端退出!
终于找到了一个真正的解决方案(虽然有点小技巧),在这个答案中 - 至少如果你使用Git Bash作为默认终端的话。
如果你在调试配置中添加参数&&exit,调试终端将在程序结束后自动退出。不过要注意,它会立即关闭终端,并清除其中的所有文本(你可能需要在脚本末尾添加一个“按任意键结束程序”的提示,以便你有时间查看任何文本,或者类似的操作)。

注意:这仍然是一种技巧,并且并不总是有效 - 如果你点击调试工具栏上的“重新启动”或“停止”按钮,它将绕过这种方法

&&基本上告诉Bash在继续执行其他命令之前停下来等待调试任务完成,然后exit会在调试会话结束后执行,从而关闭终端。
你可以通过以下方式打开运行/调试配置:
  1. 在侧边栏中打开“运行”窗口
  2. 从下拉菜单中选择运行配置,然后点击齿轮图标,这将在编辑器窗口中打开相应的launch.json文件。

enter image description here

将以下行添加到args: ["&&", "exit"]下方,并确保在上一行的末尾添加逗号!

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

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

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



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

经过一些搜索,我无法确定每次调试是否都会启动一个新的终端,但有一个解决方法。

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

注意: 下面的调试图标略有变化,此选项卡现在称为运行而不是调试

enter image description here

在 `launch.json` 中,将 `"console"` 设置从默认值 `"integratedTerminal"` 更改为 `"internalConsole"`,如下所示:
{   "version": "0.2.0",
    "configurations": [
        {   "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "internalConsole"
        }
    ]
}

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

缺点

对于那些需要在控制台上接收用户输入的脚本,我最终还是回到了集成终端,因为调试控制台不允许用户输入。

在这种情况下,你只需要不断删除多余的调试会话 - 有点麻烦。


我在integratedTerminal选项生成新终端的问题/缺陷上提交了一个问题,并且正在此处排队:https://github.com/microsoft/ptvsd/issues/1850 - LightCC
有兴趣全局使用 "internalConsole"(目前仅限于每个调试配置)的人可能希望支持此功能请求:https://github.com/microsoft/vscode-python/issues/18353 - bers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接