前言

这个应该是很久我就遇见的问题,后来我解决了,但是后来帮壮壮学长学生解决问题的时候又出来了,所以这一次便记录一下是如何解决的。

主要就是安装了anaconda之后,vs code里面自动启动anaconda总是出错。

这个问题本质上是 Windows PowerShell 的执行策略(Execution Policy)阻止了 Anaconda 的初始化脚本运行,导致 conda 没有被正确加载。其实就是 VSCode + PowerShell + Conda 常见问题。

正文

1. 问题现象

正常来说,anaconda一般会在vscode版本切换的时候启动如下的脚本:

(E:\anaconda\shell\condabin\conda-hook.ps1) ; (conda activate AMchat)

但是我们遇见了如下的报错

PS C:\Users\USTBLX\Downloads\AI agent> (E:\anaconda\shell\condabin\conda-hook.ps1) ; (conda activate AMchat) E:\anaconda\shell\condabin\conda-hook.ps1 : 
无法加载文件 E:\anaconda\shell\condabin\conda-hook.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 ab out_Execution_Policies。 所在位置 行:1 字符: 2 + (E:\anaconda\shell\condabin\conda-hook.ps1) ; 
(conda activate AMchat) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) [],PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess 
conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 48 + (E:\anaconda\shell\condabin\conda-hook.ps1) ; (conda activate AMchat) + ~~~~~ + CategoryInfo : ObjectNotFound: (conda:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

报错信息:

无法加载文件 E:\anaconda\shell\condabin\conda-hook.ps1,因为在此系统上禁止运行脚本。
PSSecurityException: UnauthorizedAccess

随后 conda 也无法识别:

conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

2. 问题原因

VSCode 默认使用 PowerShell 作为终端,而 PowerShell 有脚本执行策略(Execution Policy)限制

Anaconda 在初始化环境时会调用一个 PowerShell 脚本:

conda-hook.ps1

但是当前系统的 PowerShell 执行策略不允许执行 .ps1 脚本,因此:

  1. conda-hook.ps1安全策略拦截

  2. Anaconda 初始化失败

  3. conda 命令没有被加载到当前 shell

所以就出现:

conda : CommandNotFoundException

我们可以运行如下命令:

Get-ExecutionPolicy -List

得到当前的用户确实没有允许脚本执行的策略 CurrentUser: Undefined

Scope           ExecutionPolicy
MachinePolicy   Undefined
UserPolicy      Undefined
Process         Undefined
CurrentUser     Undefined
LocalMachine    Undefined

说明 当前用户没有允许脚本执行的策略

3. 解决办法

设置当前用户允许执行本地脚本:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

然后确认 CurrentUser 的权限:

Get-ExecutionPolicy -List

结果:

CurrentUser    RemoteSigned

4. 什么是RemoteSigned

RemoteSigned 的含义是:

脚本来源

是否允许执行

本地脚本

✅ 允许

从互联网下载的脚本

❗ 必须有签名

conda-hook.ps1 属于 本地脚本,因此允许执行。

5. 为什么这样就能解决问题

当 PowerShell 允许执行脚本后:

conda-hook.ps1

可以正常运行,它会:

  1. 初始化 Conda 环境变量

  2. 注册 conda 命令

  3. 允许 conda activate 切换环境

因此 VSCode 终端中的 Conda 环境恢复正常。

总结

该问题是由于 PowerShell 默认禁止执行脚本,导致 Anaconda 的 conda-hook.ps1 无法运行,从而 conda 命令未被加载。
通过设置 PowerShell 执行策略为 RemoteSigned,允许本地脚本执行即可解决。

然后就解决了的喵~!

参考

[1] ChatGPT

立志做一个有趣的碳水化合物。