CodeBuddy 终端无法自动激活 Python 虚拟环境?一个配置解决(附完整排查过程)

2026-10-17 软件资源 4 次阅读 0 次点赞
博客作者发现CodeBuddy终端无法自动激活Python虚拟环境,而同一项目在VSCode和Trae中正常。通过查看窗口日志和扩展宿主日志,定位到根因:CodeBuddy的product.json缺少terminalDataWriteEventAPI授权,导致vscode-python-envs扩展无法激活,而新版Python主扩展又将终端激活职责交给该扩展,两者互相等待造成死锁。解决方案是在CodeBuddy用户设置中设置python.useEnvironmentsExtension为false,让主扩展回退到内置激活逻辑,同时开启终端环境激活和shell集成。该配置仅影响CodeBuddy,不影响其他编辑器,且不受扩展版本更新影响。

同一个项目,在 VSCode 里打开终端,(.venv) 前缀会正常出现;换成 CodeBuddy,终端却干干净净,python 指向的还是全局解释器。明明已经通过"Python: 选择解释器"选好了环境,日志也确认读取到了 .\server\.venv\Scripts\python.exe,虚拟环境却始终没有自动激活。如果你也遇到了这个问题,这篇文章就从日志开始排查,看看根因在哪里,以及如何用一个配置修复。

问题现象

先说环境:Windows 11,CodeBuddy CN 1.106.1;Python 扩展套件为 ms-python.python 2026.4.0 和 ms-python.vscode-python-envs 1.20.1,均通过 open-vsx 安装。项目的虚拟环境位于 server/.venv,解释器选择正常,但新建集成终端时不会自动激活。同一个项目在 VSCode 和 Trae 里都没有这个问题。

排查第一步:查看窗口日志中的报错

打开"输出"面板,切换到"窗口"日志,可以看到一条关键错误:

Extension 'ms-python.vscode-python-envs' appears in product.json but enables LESS API proposals than the extension wants.
package.json (LOSES): terminalShellEnv, terminalDataWriteEvent
product.json (WINS): terminalShellEnv

简单来说,vscode-python-envs 扩展声明需要两个实验性 API:terminalShellEnv 和 terminalDataWriteEvent,但 CodeBuddy 安装目录下的 product.json 只授权了前者。那 terminalDataWriteEvent 又有什么用?查看扩展源码后可以发现,它的终端环境激活功能依赖 window.onDidWriteTerminalData 这个 API,对应的正是未获授权的那项提案。

再看扩展宿主日志,还能发现一连串报错:

Tool "get_python_environment_details" was not contributed.
Tool "selectEnvironment" was not contributed.
...

这些工具本应由 vscode-python-envs 注册。日志中的报错表明,这个扩展没有成功激活。

为什么降级扩展也没用

我最先想到的是降级:找一个不依赖 terminalDataWriteEvent 的旧版本装上。我装了 1.8.0,但终端还是没有激活。

我翻了 CodeBuddy 写在磁盘上的日志(%APPDATA%\CodeBuddy CN\logs\ 下对应时间戳目录里的 exthost.log),这才发现真正的问题:整个会话期间,ms-python.vscode-python-envs 从未激活过,日志里一条激活记录都没有。

原因有两个。第一,这个扩展只注册了 onLanguage:python 这一个激活事件。也就是说,编辑器里必须打开过 .py 文件,它才会激活;但日志里从未触发这个事件。第二,CodeBuddy 会自动更新这个扩展(窗口日志里能看到 Auto updating outdated extensions. ms-python.vscode-python-envs),所以降级后的版本会被悄悄升回去。

根因:主扩展在等一个无法工作的扩展

最关键的线索藏在 ms-python.python 的代码里。它内部有一个 shouldEnvExtHandleActivation() 函数:

shouldEnvExtHandleActivation = function() {
  if (!isEnvExtensionInstalled()) return false;
  const e = getConfiguration("python").inspect("useEnvironmentsExtension");
  if (e?.globalValue === false || e?.workspaceValue === false) return false;
  ...
}

新版 Python 扩展的分工是这样的:只要检测到 vscode-python-envs 已安装,且 python.useEnvironmentsExtension 没有设为 false,主扩展就会把终端激活交给它。

于是,CodeBuddy 里就卡住了:主扩展不再自行激活终端,而它等着的那个扩展,又因为缺少 API 授权无法激活。VSCode 和 Trae 没有这个问题,是因为它们内核的 product.json 授权完整。

解决方案:改一个配置

打开CodeBuddy IDE,点击文件菜单、首选项、设置,分别搜索useEnvironmentsExtension、activateEnvironment,第一个取消打勾,第二个勾上即可。

CodeBuddy IDE useEnvironmentsExtension设置界面

CodeBuddy IDE activateEnvironment设置界面

也可以直接修改 CodeBuddy 的用户设置(%APPDATA%\CodeBuddy CN\User\settings.json)里加入:

"python.useEnvironmentsExtension": false,
"python.terminal.activateEnvironment": true,
"python.terminal.shellIntegration.enabled": true

第一行是关键。它会让 shouldEnvExtHandleActivation() 返回 false,主扩展随即改用内置的终端激活逻辑,通过 shell integration 注入 Activate.ps1。这条路径需要的 API,CodeBuddy 都已授权。配置只写在 CodeBuddy 里,不会影响同一台机器上的 VSCode 和 Trae。

重新加载窗口,打开一个 .py 文件,再新建终端。Python 扩展日志里出现下面这行,就说明配置生效了:

Send text to terminal: & e:/Project/超腾开源平台/server/.venv/Scripts/Activate.ps1

终端里的 (.venv) 前缀也会回来。这个方案不受 python-envs 扩展版本影响,安装最新版也不会互相干扰。

几点补充

  • 启动时仍会出现 product.json 报错,可以忽略;python-envs 已经被完全绕过。
  • 根本原因是 CodeBuddy CN 的 product.json 没跟上微软扩展的更新。可以向官方反馈,并附上报错和修复建议:给 ms-python.vscode-python-envs 补上 terminalDataWriteEvent 授权。官方修复后,删掉 python.useEnvironmentsExtension: false,就能恢复新架构。
  • 遇到扩展行为异常,别只看输出面板。logs 目录下的 exthost.log 往往更有用:哪些扩展激活了、由什么事件触发、有没有报错,都能从里面找到。

如果你也遇到过 CodeBuddy 的类似问题,欢迎在评论区交流排查思路。

最后更新于3小时前

评论 (0)

请 登录 后发表评论

暂无评论,快来发表第一条评论吧!