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

Lig*_*tCC 3 python visual-studio-code vscode-debugger

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

是否有选项设置可以阻止这种情况?这是预期的行为还是缺陷?


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

在此处输入图片说明

Lig*_*tCC 12

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

终于在这个答案中看到了一个真正的解决方案(好吧,有点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"]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

注意 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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


不足之处

我最终返回到集成终端以获取期望用户在控制台输入的脚本,因为调试控制台不允许用户输入。

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