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

文章目录

  • 一、问题描述
  • 二、问题溯源
  • 三、解决方案
    • 3.1 测试
    • 3.2 方案一:不在powershell中使用conda
    • 3.2 方案二:需要时再在powershell中使用conda(推荐)
  • 四、powershell 7 特点

一、问题描述

powershell启动缓慢:

conda init 导致的 powershell 启动缓慢的问题(Loading personal and system profiles took xxxx ms.)_第1张图片

每次启动都会加载很久的配置文件: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)。
conda init 导致的 powershell 启动缓慢的问题(Loading personal and system profiles took xxxx ms.)_第2张图片

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 类似。
    conda init 导致的 powershell 启动缓慢的问题(Loading personal and system profiles took xxxx ms.)_第3张图片

这两个提示符的目的都是为了简化用户的工作流程,使他们能够轻松地使用 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);
    conda init 导致的 powershell 启动缓慢的问题(Loading personal and system profiles took xxxx ms.)_第4张图片

四、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. 智能命令补全 : 我常用的是:输入一个字符后,会以浅色显示历史命令,用键盘右键即可补全在这里插入图片描述



~

你可能感兴趣的:(OS,Related,conda)