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

2023-08-11 23:51:53

一、问题描述

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



~

更多推荐

第五章:数组

一、一维数组1、一维数组定义方式一维数组定义的三种方式:①数据类型数组名[数组长度];②数据类型数组名[数组长度]={值1,值2...};注意:第二种方式中,如果{}内不足数组长度个数据,剩余数据用0补全③数据类型数组名[]={值1,值2...};总结:①数组名的命名规范与变量名命名规范一致,不要和变量重名;②数组中下

【音视频】ffplay源码解析-FrameQueue队列

帧队列架构位置结构体源码FrameQueue结构体/*这是一个循环队列,windex是指其中的首元素,rindex是指其中的尾部元素.*/typedefstructFrameQueue{Framequeue[FRAME_QUEUE_SIZE];//FRAME_QUEUE_SIZE最大size,数字太大时会占用大量的内存

【多目标跟踪】 TrackFormer 耗时三天 单句翻译!!!

【多目标跟踪】TrackFormer耗时三天单句翻译!!!TrackFormer:Multi-ObjectTrackingwithTransformersAbstractThechallengingtaskofmulti-objecttracking(MOT)re-quiressimultaneousreasoning

Java面向对象编程

给出数据表score(stu-id,name,math,english,Chinese),下列语句正确的是()A.Selectsum(math),avg(chinese)fromscoreB.Select*,sum(english)fromscoreC.Selectstu-id,sum(math)fromscoreD.

大模型从入门到应用——LangChain:代理(Agents)-[代理执行器(Agent Executor):结合使用Agent和VectorStore]

分类目录:《大模型从入门到应用》总目录代理执行器接受一个代理和工具,并使用代理来决定调用哪些工具以及以何种顺序调用。本文将参数如何结合使用Agent和VectorStore。这种用法是将数据加载到VectorStore中,并希望以Agent的方式与之进行交互。推荐的方法是创建一个RetrievalQA,然后将其作为整体

趣解设计模式之《珍爱生命,远离只狼》

〇、小故事小王最近打算入手一款叫《只狼》的游戏,这款游戏特别的硬核,也就是说,普通的小怪战斗力都特别的强,而作为主角的我们,也很容易被小兵打败。除了游戏中的小兵和Boss很难打败之外,如果在游戏中被杀了,也需要从这章的开头开始打,没办法直接从死亡点附近复活,这个就又为游戏增加了难度。不过,对这款游戏痴迷的玩家依然很多很

MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置

MC-4/11/01/400ELAU软件允许用户完全访问相机设置一个完整的Sentinel模具保护解决方案包括一到四台冲击式摄像机、专用红外LED照明和镜头、Sentinel软件以及所有与模压机连接的必要互连组件。摄像机支架基于磁性,可快速、安全、灵活地部署。此外,一个可选的工业电脑和显示器可在一个移动推车,快速新闻到

移动端H5封装一个 ScrollList 横向滚动列表组件,实现向左滑动

效果:1.封装组件:<template><divclass="scroll-list"><divclass="scroll-list-content":style="{background,color,fontSize:size}"ref="scrollListContent"><divclass="scroll-li

第七章(2):深度学习在自然语言处理NLP中的应用

第七章(2):深度学习在自然语言处理NLP中的应用作者:安静到无声个人主页作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。Thanks♪(・ω・)ノ如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!o( ̄▽ ̄)d欢迎大家来到安静到无声的《基于

Python--函数

目录1、定义函数1.1向函数传递信息1.2实参和形参2、传递实参2.1位置实参2.2关键字实参2.3默认值2.4等效的函数调用2.5避免实参错误3、返回值3.1返回简单的值3.2让实参变成可选的3.3返回字典3.4结合使用函数和While循环4、传递列表4.1在函数中修改列表4.2禁止函数修改列表5、传递任意数量的实参

C++学习笔记——类与对象(六个默认成员函数)

1、构造函数在一个类中,编译器会自动生成默认的成员函数,当对象进行初始化时,会默认调用这个函数来初始化。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。它的特点是:没有返回值系统自动调用构造函数可以重载名字和类名

热文推荐