2 conda环境管理
2.1 相关术语
2.1.1 包,库
Python的库/包是可重用的代码集合。 通过调用已有的库/包,你可以方便地实现一些具体功能,而不需要自己从头编写所有底层功能。
小节 5.6.1 有对模块/库/包更详细的解释。
一些标准库:
- random,生成伪随机数,进行抽样。
- math,进行取对数,开根号等数学运算。
- os,用于与操作系统交互,可以新建/删除/重命名文件夹,查看/改变工作目录。
一些第三方库:
- scikit-learn,实现了许多机器学习算法。
- numpy:多维数组和科学计算功能。
- pandas:数据处理和分析。
- requests:用几行代码就能发送HTTP网络请求进行网络爬虫,而不必处理复杂的网络协议。
- jieba:对中文文本进行分词。
2.1.2 环境
Python 环境是一个独立且隔离的 Python 运行时空间,包含特定版本的 Python 解释器、标准库以及用户安装的第三方包。 在 Python 环境中,所有的库和模块安装仅对该环境可见可用,与其他环境相互独立。
初学者使用最新的稳定版本的Python即可,进行具体项目时可能由于需要安装其他版本的Python。
做不同的菜肴,往往需要不同的工具与食材。
(做不同的任务,需要不同的第三方库,Python版本)
做中餐,常用酱油,醋,料酒,八角,香叶,柴火灶……
做西餐,常用烤箱,料理机,黑胡椒,奶油,黄油,迷迭香……
由于种种原因,如场地有限,一个厨房不能容纳所有的料理工具和食材。
(由于版本冲突原因,一个环境不能安装多个版本的Python,也不可能安装所有库包的所有版本)
为了做出多种风格的菜肴,需要准备多个厨房。
(为了完成不同的任务,需要准备多个Python环境)
Conda 是一个开源的软件包和环境管理系统。 它允许你在同一台电脑上创建多个独立的“虚拟环境”,每个环境里可以安装不同版本的软件包,互不干扰。
在Windows操作系统中,使用conda需要通过命令行工具Anaconda Prompt或Anaconda Powershell Prompt。即下面所有以conda开头的命令,都需要在Anaconda Prompt或Anaconda Powershell Prompt中输入。本教程使用Anaconda Prompt。
对于Mac OS或Linux操作系统,可直接在终端中使用conda命令。
Anaconda Prompt相当于Windows的命令行,Anaconda Powershell相当于Powershell。二者区别在于:
- Anaconda PowerShell Prompt 新建的环境默认在C盘,而 Anaconda Prompt 新建的环境默认在Anaconda的安装目录。
- Anaconda PowerShell Prompt的功能比Anaconda Prompt更多,更现代。
2.2 环境管理
创建环境
在Anaconda Prompt中使用
conda create命令以创建环境。
Anaconda Prompt
# 命令
# 创建环境特定名称的环境
conda create -n 环境名称
# 创建环境的同时可以指定版本号
conda create -n 环境名称 python=版本号
# 例子
# 创建名为tutorial的环境
conda create -n tutorial
# 创建名为tutorial的环境,此环境使用Python3.13
conda create -n tutorial python=3.13
激活与退出环境
要在环境中安装、删除包,需要先激活该环境。
conda activate命令激活环境,conda deactivate退出当前环境。当前激活的环境名称,在每行开头的括号中显示。打开anaconda prompt时,默认激活的是base环境。
Anaconda Prompt
# 命令
# 激活特定名称的环境
conda activate 环境名称
# 退出当前环境
conda deactivate
# 例子
# 激活名为tutorial的环境
conda activate tutorial
- 查看所有环境。
Anaconda Prompt
# 下面两个命令都可以查看现有的所有环境
conda info -e
conda env list
- 删除环境
Anaconda Prompt
# 命令
# 删除特定名称的环境
conda env remove -n 要删除的环境名称
# 例子
# 删除名为tutorial的环境
conda env remove -n tutorial 2.3 包管理
安装包
一般先用
conda activate命令激活某个环境,然后用conda install或pip install命令在该环境中安装包。最常用的安装包命令:
Anaconda Prompt
# 激活具有特定名称的环境
conda activate 环境名称
# 在当前环境中用conda安装某个包
conda install 包名称
# 在当前环境(tutorial)中用pip安装某个包
pip install 包名称其他安装包的命令:
Anaconda Prompt
# 安装指定版本的包
conda install 包名称=包版本号
# 从指定频道安装包
conda install --channel 频道名称 包名称
# 从本地的.conda文件安装包
conda install <PATH_TO_PACKAGE>.conda
# 从本地的.tar.bz2文件安装包
conda install <PATH_TO_PACKAGE>.tar.bz2Anaconda Prompt
# 例子
# 在当前环境安装包scikit-learn
conda install scikit-learn
# 在当前环境安装包scikit-learn包,同时指定包版本为1.4.0
conda install scikit-learn=1.4.0
# 在当前环境安装包scikit-learn包,同时指定从频道(channel)conda-forge获取包
conda install --channel conda-forge scikit-learnconda会自动处理第三方库的依赖关系。安装过程会列出需要安装的包及其依赖的包,询问是否继续,输入y,回车继续。
pip是Python的标准软件包管理器,内置于Python发行版中,可以安装Python包索引PyPI中的包。 一些无法通过conda安装的包,可用pip安装,如jieba。
安装成功后,用conda list命令可查到环境中所有包或特定包的信息。
Anaconda Prompt
# 命令
# 查看当前环境中所有包的信息
conda list
# 查看当前环境中特定包的信息
conda list 包名称
# 例子
# 查看当前环境中pip包的信息
conda list pip
- 删除包
Anaconda Prompt
# 命令
# 卸载当前环境中的某个包
conda remove 包名称
# 例子
# 卸载当前环境中的pandas库
conda remove pandas删除过程中会列出要卸载的库,询问是否继续,输入y,回车继续。
一些包只能在Python的特定版本下工作,在Anaconda Prompt中用python -V查看当前环境安装的Python版本。
- 更新包
有时希望把旧版本的包升级到最新版本。
Anaconda Prompt
# 命令
# 用pip更新包
pip install --upgrade 包名称
# 用conda更新包
conda upgrade 包名称2.4 其他问题
2.4.1 换源
channel是conda获取包的仓库,通常由社区、开发者或组织维护,包含大量用于不同编程语言和工具的软件包。 如果默认的channel链接不稳定,可配置一些国内好用的channel,如清华源。
打开隐藏文件
.condarc。.condarc一般位于当前用户的家目录(C:\Users\用户名)。 因为.condarc是隐藏文件,所以需要设定资源管理器显示隐藏的项目。Windows首次编辑
.condarc文件时,需在Anaconda Prompt中运行conda config --set show_channel_urls yes,以生成该文件。

修改隐藏文件
.condarc如下。下面的代码使用的是清华源。 如果这个源不可用,可以搜索其他大学的镜像站。
.condarc
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud- 在Anaconda Prompt中运行
conda clean -i或conda clean -a,清除缓存,启用新的channel。
2.4.2 用户名含中文或空格
如果你计算机的用户名含有中文或空格,打开Anaconda Prompt时显示的当前工作路径会含有中文或空格,这可能会导致无法正常创建环境或安装包。
解决方案: 修改.condarc文件(此文件的创建见 小节 2.4.1 ),在其中添加类似于下列的内容:
.condarc
envs_dirs:
- D:\Anaconda3\envs
pkgs_dirs:
- D:\Anaconda3\pkgs上面内容的作用,是将默认的环境存储路径和包存储路径,分别修改为D:\Anaconda3\envs和D:\Anaconda3\pkgs。
上面两个路径可以按你的喜好修改,只是要注意:
- 路径中没有中文或空格。
- 该路径确实可以在你的计算机上创建。例如,如果你的计算机没有D盘,只有C盘,用
D:\...就不合适。
修改完成后,保存.condarc 文件,关闭之。 现在你应该能按照前面几节的步骤用conda进行环境管理了。
2.4.3 pip安装包,遇到OSError
用pip安装包,出现形如下的OSError错误:ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: ...,信息指向一个whl文件。
产生原因是pip 的本地缓存目录中的 .whl 文件权限不对。 可能是之前用管理员身份运行的 pip 创建了这些缓存文件,现在普通用户身份无法写入。
可用pip cache purge清理pip缓存,然后再安装该包。
pip cache purge # 清理pip缓存
pip install jieba # 重新安装要装的包,这里是jieba包
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: ...,信息指向一个whl文件。
2.4.4 启动Anaconda Prompt时报错
造成这一问题的原因应该有很多。下面举一个作者亲身经历的案例,案例中的原因是改变了base环境中的包版本,导致base环境无法启动。相关经验教训是:
- 不要改变base环境中包的版本
- 尽量为项目创建新的环境,在新的环境中安装需要的包,运行Python代码。
故事背景:用户发现周二晚上还能跑的爬虫代码,到周三就不能获取数据了,于是将爬虫代码发给AI排查问题。AI的结论是数据来源网站的API更换,最后也没有解决相关数据的获取。
周四,当用户启动AnacondaPrompt准备用Jupyter Notebook写点东西时,一大堆报错扑面而来,打了用户一个措手不及。
【兴师问罪的用户】:
昨天你是不是对我的Python环境做了什么,我现在启动anaconda prompt,有报错,且(base)没有了,直接是显示路径
【冷静的小虾】:
先说我能确认做过什么:
- 在你的 miniconda3 基础环境里执行过
pip install app-store-scraper(安装到C:\Users\HUAWEI\miniconda3\Lib\site-packages) - 用隔离的 Python 3.13.12 创建了一个 venv(路径
C:\Users\HUAWEI\.workbuddy\binaries\python\envs\default),和 conda 完全分开 - 在那个 venv 里装了
requests
第1条有可能带来副作用,但通常 pip install 不会破坏 conda 的 prompt 显示。
要准确判断,需要你把报错信息贴给我看。
具体操作:打开 Anaconda Prompt,把显示的报错文字完整复制过来。常见的几种情况:
| 现象 | 可能原因 |
|---|---|
(base) 消失,直接显示路径 |
conda init 配置被改动,或 .bashrc/.bash_profile 出问题 |
报 CondaError 或 CommandNotFoundError |
conda 环境变量或脚本损坏 |
| 报某个包的 import 错误 | pip 安装了与现有包冲突的版本 |
把错误信息发给我,我来判断是否是昨天操作引起的,以及怎么修复。
【乖乖听话的用户】:
C:\Users\HUAWEI\miniconda3\Lib\site-packages\requests\__init__.py:89: RequestsDependencyWarning: urllib3 (2.7.0) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\exception_handler.py", line 18, in __call__
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\cli\main.py", line 77, in main_sourced
from ..activate import _build_activator_cls
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\activate.py", line 48, in <module>
from .exceptions import ActivateHelp, ArgumentError, DeactivateHelp, GenericHelp
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\exceptions.py", line 17, in <module>
from requests.exceptions import JSONDecodeError
ImportError: cannot import name 'JSONDecodeError' from 'requests.exceptions' (C:\Users\HUAWEI\miniconda3\Lib\site-packages\requests\exceptions.py)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\HUAWEI\miniconda3\Scripts\conda-script.py", line 12, in <module>
sys.exit(main())
^^^^^^
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\cli\main.py", line 105, in main
return conda_exception_handler(main, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\exception_handler.py", line 386, in conda_exception_handler
return_value = exception_handler(func, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\exception_handler.py", line 21, in __call__
return self.handle_exception(exc_val, exc_tb)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\exception_handler.py", line 52, in handle_exception
from .exceptions import (
File "C:\Users\HUAWEI\miniconda3\Lib\site-packages\conda\exceptions.py", line 17, in <module>
from requests.exceptions import JSONDecodeError
ImportError: cannot import name 'JSONDecodeError' from 'requests.exceptions' (C:\Users\HUAWEI\miniconda3\Lib\site-packages\requests\exceptions.py)
C:\Users\HUAWEI>【依旧冷静的小虾】:
看到报错了,问题很清晰,确实是昨天 pip install app-store-scraper 动了 base 环境的包版本导致的。
【 诊断】
两个错误叠加:
| 问题 | 原因 |
|---|---|
urllib3 (2.7.0) doesn't match a supported version |
urllib3 被升级到了 2.x,但 requests 旧版只支持 urllib3 < 2.0 |
cannot import name 'JSONDecodeError' from 'requests.exceptions' |
requests 版本太旧(< 2.28.0),conda 自身依赖这个接口 |
两个包版本不兼容,conda 的激活脚本跑不起来,所以 (base) 消失了。
【修复方法】
在 Anaconda Prompt 里直接运行(此时虽然 conda 命令坏了,但 pip 还能用):
pip install "requests>=2.28.0,<3.0" "urllib3>=1.26,<2.0"
这条命令会把 requests 升到支持 JSONDecodeError 的版本,同时把 urllib3 降回 1.x 系列,两边兼容。
运行完之后关闭再重新打开 Anaconda Prompt,(base) 应该就回来了。
如果 pip 也找不到(极少数情况),备用方案是直接用 Python 执行:
C:\Users\HUAWEI\miniconda3\python.exe -m pip install "requests>=2.28.0,<3.0" "urllib3>=1.26,<2.0"
事后建议:以后需要安装额外包,最好新建一个 conda 环境(conda create -n myenv python=3.11),不要在 base 里 pip install,就不会污染 conda 本身的依赖。
故事的结局:base环境回来了,Anaconda Prompt看似恢复了正常。
用户要求AI记住:不用base环境跑代码;以后需要运行Python代码,都在用户指定的环境里跑;安装新包,要经过用户同意。
但关于AI的故事,并不总是好结局。
很多时候,是AI冷静地胡说,用户懵逼地挣扎,直至放弃,特别是当用户对AI的言行毫无辨别力时。
AI可以拓宽我们的能力边界,但无法替我们产出超越自身认知的成果。 人在与AI协同工作时,要始终把我方向盘,保持对方向和节奏的把控,至少要在被AI一路狂飙带入天坑一切都太难挽回之前停下。
2.5 练习
- 在自己的电脑上安装Miniconda。
- 新建一个环境,Python版本使用3.14。如果不知道这个环境要叫什么名字,用你自己的名字拼音。
- 在2中新建的环境中,安装包pandas。
- 用
conda list pandas确认pandas包安装成功。