为啥 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 - 如何使用启动配置调试启动自己的调试器的节点程序?

vscode调试的为啥会出现两个错误??

VSCode - 使用集成终端而不是调试控制台进行调试/启动

VSCode:C++ 调试器无法启动或正确附加