python - 在 VSCode 中,Python 调试器每次调试时都会启动一个新终端
问题描述
在 Python 中调试时,在 VS Code 中,每次调试时都会创建一个新终端。代码只是每次都在终端窗口的下拉列表中添加一个终端。我必须手动删除每个终端,或者在一段时间后删除其中的一堆——否则代码最终会挂起。
是否有一个选项设置来阻止这个?是预期的行为还是缺陷?
更新:这是每次创建新调试终端时发生的情况的屏幕截图。这是终端窗口右侧的下拉菜单,您可以使用它打开或访问ctrl-`(坟墓键、非移动波浪号或 ~ 键)。它显示了普通的bash终端,每次运行脚本时都会重复使用的Python终端,但有 3 个Python 调试控制台窗口。每次调试时都会创建一个新的Python 调试控制台F5( )。所以我每次调试时都需要进去手动删除一个Python Debug Console(点击右边的垃圾桶图标)。在我意识到它正在发生之前,这已经打开了多达 20 多个终端窗口。
解决方案
更新(~9/2021):
最新版本的 VS Code(~v1.60 及更高版本)重新设计了一些核心测试基础设施,这可能不是什么大问题。但是,我仍然偶尔会遇到它。
即使没有以下内容,通常也有效的一件事似乎是避免“重新启动调试”按钮。如果您只是停止调试会话然后重新启动,但是您首先启动它,我很少得到多个会话窗口。
一个真正的解决方案:让终端之后退出!
终于在这个答案中看到了一个真正的解决方案(好吧,有点hacky)- 至少如果你使用Git Bash作为你的默认终端。
如果您添加参数&&
和exit
调试配置,调试终端将在您的程序结束后自动退出。但请注意,它会立即关闭终端以及其中的所有文本(您可能需要在脚本末尾添加“按任意键结束程序”,以便您有时间查看任何文本,或类似那)。
注意:这仍然是一个 hack,它并不总是有效 - 如果您点击调试器工具栏上的“重新启动”或“停止”按钮,它将缩短此方法
基本上告诉 Bash在&&
继续执行其他命令之前停止并等待调试任务完成,然后在exit
调试会话结束后执行,这将关闭终端。
您可以通过打开运行/调试配置来执行此操作,如下所示:
- 转到边栏中的“运行”窗口
- 在下拉列表中选择运行配置,然后按齿轮,这将
launch.json
在编辑器窗口中显示相应的文件。
- 添加
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 中,每个会话都会被清除和重用,而不是在每个会话中生成一个新的集成终端。
不足之处
我最终回到集成终端,寻找需要用户在控制台输入的脚本,因为调试控制台不允许用户输入。
在这种情况下,您只需要不断删除额外的调试会话 - 有点痛苦。
推荐阅读
- python - 如何在两个标记中找到特定的单词?
- c# - AspNetCore WEB/REST API 对象作为参数?与传递Json?
- arrays - 在swift 4中将多个数组的元素添加在一起
- javascript - Node JS 访问音频接口
- angular - 尽管在构造函数中进行了设置,但数据未定义
- sql - 使用 ORDER BY SUM 的 UNION 查询
- javascript - 返回 false 不会停止值为 1 的循环
- zenity - Zenity 是否提供了隐藏按钮的选项?
- ms-access - Dlookup 未正确评估双重标准
- python - 将列表变回字符串python