为啥 VSCode 在启动调试器之前不激活 conda?
Posted
技术标签:
【中文标题】为啥 VSCode 在启动调试器之前不激活 conda?【英文标题】:Why doesn't VSCode activate conda before starting the debugger?为什么 VSCode 在启动调试器之前不激活 conda? 【发布时间】:2019-10-21 19:47:35 【问题描述】:当我在 VSCode 中启动调试器时,conda 环境只有在调试过程因“缺少所需的依赖项”导入错误而停止后才会被激活。然后立即重新启动调试器工作正常。
Anaconda“基础”和其他环境会出现此问题。
测试代码:import_pandas.py
import pandas
print("Pandas import succeeded!")
VSCode Python 调试控制台:
Microsoft Windows [Version 10.0.16299.1146]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\Users\peter\demo>cd c:\Users\peter\demo &&
cmd /C "set "PYTHONIOENCODING=UTF-8" &&
set "PYTHONUNBUFFERED=1" &&
C:\Users\peter\AppData\Local\Anaconda3\python.exe
c:/Users/peter/.vscode/extensions/ms-python.python-2019.5.18678/pythonFiles/ptvsd_launcher.py
--default --client --host localhost --port 49530
c:\Users\peter\demo\import_pandas.py "
...
ImportError: Missing required dependencies ['numpy']
C:\Users\peter\demo>C:/Users/peter/AppData/Local/Anaconda3/Scripts/activate
(base) C:\Users\peter\demo>conda activate base
(base) C:\Users\peter\demo>
请注意,调试器停止后 conda 会自动激活。
激活环境后,调试过程不再失败:
(base) C:\Users\peter\demo>cd c:\Users\peter\demo &&
cmd /C "set "PYTHONIOENCODING=UTF-8" &&
set "PYTHONUNBUFFERED=1" &&
C:\Users\peter\AppData\Local\Anaconda3\python.exe
c:/Users/peter/.vscode/extensions/ms-python.python-2019.5.18678/pythonFiles/ptvsd_launcher.py
--default --client --host localhost --port 49544
c:\Users\peter\demo\import_pandas.py "
Pandas import succeeded!
有什么方法可以在第一次调用调试器之前激活 conda?
【问题讨论】:
【参考方案1】:我已经安装了AutoLaunch 扩展并添加了以下启动配置:
// Activate environment on startup with AutoLaunch extension
"name": "activate",
"type": "python",
"request": "launch",
"code": "",
"auto": true,
,
所以它运行空的 Python 脚本,然后激活的终端保持打开状态。
UPD。现在我只是在 VS Code 中使用 PowerShell,并没有遇到这个问题:
启动 Anaconda Powershell 提示 (conda)conda init powershell
它会向 %USERPROFILE%\Documents\WindowsPowerShell\profile.ps1 写入脚本,但请仔细检查您的用户名中是否包含非拉丁符号!
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
conda config --set auto_activate_base false
【讨论】:
【参考方案2】:遇到同样的问题。
来源:https://github.com/formulahendry/vscode-code-runner/issues/395https://github.com/formulahendry/vscode-code-runner/issues/395
把这个放到settings.json中:
"code-runner.executorMap":
"python": "$pythonPath -u $fullFileName",
,
"code-runner.runInTerminal": true,
它不会在第一次执行之前放置“conda activate ...”,而是从以下位置替换代码运行器命令:
"python -u <file path>"
到:
"<virtual environment path> -u <file path>"
这解决了我的问题
【讨论】:
感谢您的回答!我的设置中已经有了这些行,但它并没有解决我的问题。【参考方案3】:这似乎符合我的 Python 调试问题。我的 python 脚本在基本 conda 环境中正常工作。但是,当我使用 Python 扩展启动调试器时,我立即开始在调试控制台中看到导入 DLL 错误,但调试器并没有在此错误上停止。它只是在 3 秒左右后关闭调试器而不执行脚本。我什至可以稍后在脚本中设置断点,并且它不会在此行之后停止。与原始描述不同,重新启动调试器也是如此。 我尝试卸载然后重新安装 MS Python 扩展无济于事。您可以提供的任何线索都会很棒,我不是 vs 代码的专家。谢谢。
更新:我的调试器工作正常。我创建了一个放置在我的项目工作区中的 Windows 10 Python 虚拟环境。显然,这可以解决下面描述的 conda env 激活延迟,Windows 虚拟环境显然不是这种情况。
【讨论】:
感谢您的回答! Virtualenv 和 pipenv 对我来说也很好用。这是一个 conda 问题。【参考方案4】:不是调试器在调试器故意停止后激活 conda 环境,而是 conda 激活太慢以至于直到调试器本身完成之后才完成(这不是虚拟环境的问题,因为它们不需要激活即可正常运行)。基本上,我们要求 VS Code 使用激活命令启动终端,然后启动调试器,但调试器能够比 conda 激活更快,因此直到调试器之后才会执行。
使用 conda 很难。您可以关注our meta issue,它正在跟踪我们试图与 conda 团队一起解决的所有问题。
【讨论】:
感谢您的提示。我已经害怕了。所以至少我可以停止寻找以某种方式改变执行顺序的设置参数。 如果你愿意,可以turn automatic activation off with"python.terminal.activateEnvironment": false
。
我可以通过 "terminal.integrated.shellArgs.windows": ["/K", "conda activate py37"]
设置手动激活 conda。虽然这仅适用于集成终端,但它不会对调试器使用的集成终端产生影响。但是,自动激活的一个问题是它首先(并且不必要地)激活了 conda 基础环境,并且仅在第二步中激活项目环境 - 并且调试器通常正好在两者之间启动。
VSCode 重用 python 调试控制台进行下一次调试启动。所以解决方法是保持python调试控制台打开并再次启动调试......以上是关于为啥 VSCode 在启动调试器之前不激活 conda?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 VSCode 调试器不能使用 C# 中的默认 launch.json 设置?
为啥我的 VS Code 调试器在我的 C++ 代码周围弹跳?
VSCode - 如何使用启动配置调试启动自己的调试器的节点程序?