conda init 导致的 powershell 启动缓慢的问题(Loading personal and system profiles took xxxx ms.)

一、问题描述

powershell启动缓慢:

在这里插入图片描述

每次启动都会加载很久的配置文件:Loading personal and system profiles took xxxx ms

我用的是powershell 7.xx,系统自带的5.x可能也会出现这样的问题,一个道理。

新版本的名称是pwsh.exe即,输入win r,然后输入pwsh,回车,即可快速打开。

这个很好用,建议安装(去微软官网下载安装)。

二、问题溯源

既然是加载配置文件花费了较长的时间,就看看配置文件是什么。

输入:

$PROFILE
  • $PROFILE.AllUsersAllHosts: 对所有用户和所有主机有效的配置文件。
  • $PROFILE.AllUsersCurrentHost: 对所有用户和当前主机有效的配置文件。
  • $PROFILE.CurrentUserAllHosts: 对当前用户和所有主机有效的配置文件。
  • $PROFILE.CurrentUserCurrentHost: 对当前用户和当前主机有效的配置文件。 当你直接输入 $PROFILE 时,PowerShell 实际上返回的是 $PROFILE.CurrentUserCurrentHost 的值,这是对当前用户和当前主机有效的配置文件。

会显示你的配置文件的位置,比如:

C:\Users\xxx\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

进入相关目录,你可能会发现:

  • 没有Microsoft.PowerShell_profile.ps1
  • 只有:profile.ps1

经过测试,名字不影响。

打开配置文件可以看到:

#region conda initialize
# !! Contents within this block are managed by 'conda init' !!
If (Test-Path "E:\anaconda3\Scripts\conda.exe") {
    
    
    (& "E:\anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{
    
    $_} | Invoke-Expression
}
#endregion

这是关于conda环境的内容,是你在某次执行:conda init powershell 后生成的。

配置文件解读:

这段脚本的目的是检查 conda.exe 是否存在于指定的路径中。如果存在,它将执行 conda.exe 以为 PowerShell 生成初始化脚本,并执行该脚本来设置 Anaconda 的环境。这确保了当你在 PowerShell 中使用 conda 命令时,所有必要的环境变量和设置都已正确配置。

  1. If (Test-Path "E:\anaconda3\Scripts\conda.exe") {

    这是一个条件语句,它检查指定的路径(即 E:\anaconda3\Scripts\conda.exe)是否存在。Test-Path 是一个 PowerShell 命令,用于确定文件或目录是否存在。如果 conda.exe 存在于指定的路径中,那么大括号 {} 内的代码将被执行。

  2. (& "E:\anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression

    这是一个复杂的命令,我会分部分解释:

    • & "E:\anaconda3\Scripts\conda.exe" "shell.powershell" "hook": 这部分使用 & 运算符来执行 conda.exe。它传递了两个参数给 conda.exeshell.powershellhook。这基本上是告诉 conda 为 PowerShell 生成初始化脚本。

    • | Out-String: 这部分将 conda 命令的输出转换为字符串格式。| 是一个管道符号,它将前一个命令的输出传递给后一个命令。

    • ?{$_}: 这是一个过滤器,它确保传递给下一个命令的字符串不是空的。

    • Invoke-Expression: 这个命令执行传递给它的字符串作为 PowerShell 命令。所以,conda 生成的初始化脚本将被执行,从而设置 Anaconda 的环境。

  3. }

    这是 If 语句的结束大括号。

三、解决方案

3.1 测试

把配置文件注释掉(井号),再次启动powershell。

现在是秒打开,但是不会进入conda环境(base)。
在这里插入图片描述

3.2 方案一:不在powershell中使用conda

在powershell中使用conda无非就是配置虚拟环境。那可不可以不用powershell呢?

Anaconda 通常会为用户提供两个 PowerShell 变种:

  1. Anaconda PowerShell Prompt: 这是一个特殊的 PowerShell 提示符,预先配置了所有必要的环境变量和设置,以便用户可以直接使用 conda 和其他 Anaconda 工具。当你从这个提示符启动时,你不需要执行任何额外的初始化步骤就可以使用 Anaconda 的所有功能。

  2. Anaconda Prompt (cmd): 这是一个基于 Windows 命令提示符 (cmd.exe) 的提示符,也预先配置了 Anaconda 的环境。虽然它不是 PowerShell,但它的功能与 Anaconda PowerShell Prompt 类似。
    在这里插入图片描述

这两个提示符的目的都是为了简化用户的工作流程,使他们能够轻松地使用 Anaconda 和其相关工具,而无需手动配置环境或执行其他初始化步骤。

如果你已经安装了 Anaconda,你应该可以在 Windows 的开始菜单中找到这两个提示符。如果你主要使用 PowerShell,我建议使用 “Anaconda PowerShell Prompt”,因为它提供了 PowerShell 的所有功能,同时还集成了 Anaconda 的工具和设置(当然了,打开速度比较慢)。
在这里插入图片描述

因此,方案一可以把powershell的配置文件注释掉,使用Anaconda PowerShell Prompt即可。

3.2 方案二:需要时再在powershell中使用conda(推荐)

依然是注释掉powershell配置文件中关于conda的部分。

把关于conda的配置单独存为一个文件,需要使用conda的时候,在powershell中运行这个脚本即可。

具体做法:

  1. 运行powershell,查看默认命令执行的目录,一般是:C:\Users\username
  2. 为了方便,把关于conda的配置文件报错在上述位置,比如命名为:conda.ps1
  3. 需要在powershell中使用conda的时候,运行这个脚本:./conda.ps1./表示本目录,同Linux);
    在这里插入图片描述

四、powershell 7 特点

PowerShell 7 引入了许多新特点和改进。以下是一些主要的特点:

  1. 跨平台支持:PowerShell 7 是跨平台的,支持 Windows、macOS 和 Linux。

  2. 与 Windows PowerShell 兼容:PowerShell 7 旨在与 Windows PowerShell 5.1 兼容,使得迁移变得更加容易。

  3. 新的并行功能:通过 ForEach-Object -Parallel,用户可以并行运行脚本块。

  4. 新的运算符:引入了 ????= 运算符,用于处理 $null 值。

  5. 链式运算符:引入了 &&|| 运算符,允许用户链式执行命令。

  6. 三元运算符:PowerShell 7 添加了三元运算符 a ? b : c

  7. 新的 Get-Error 命令:这个命令提供了一个详细的、结构化的错误视图。

  8. 其他改进:包括对 JSON cmdlets 的性能改进、新的 Get-SubString 命令、以及其他许多增强功能和修复。

  9. 历史命令: PowerShell 7(以及之前的版本)都有历史命令功能。这个功能允许用户查看和回顾之前执行的命令。(不同于cmd,即使关闭后重新打开,也可以查询历史命令)以下是与历史命令功能相关的一些基本操作:

    1. Get-History:这个命令会列出之前执行的所有命令的历史记录。

    2. Invoke-History:这个命令允许用户重新执行之前的命令。例如,Invoke-History -Id 5 会重新执行ID为5的命令。

    3. Add-History:这个命令允许用户添加命令到历史记录中。

    4. Clear-History:这个命令会清除所有的命令历史记录。

    5. 上/下箭头键:在PowerShell中,用户可以使用上/下箭头键来回顾和执行之前的命令。

    6. Ctrl + R:这是一个交互式搜索功能,允许用户搜索之前执行的命令。

  10. 智能命令补全 : 我常用的是:输入一个字符后,会以浅色显示历史命令,用键盘右键即可补全在这里插入图片描述



~

猜你喜欢

转载自blog.csdn.net/weixin_43764974/article/details/132241233