2  conda环境管理

2.1 相关术语

2.1.1 包,库

Python的库/包是可重用的代码集合。 通过调用已有的库/包,你可以方便地实现一些具体功能,而不需要自己从头编写所有底层功能。

小节 5.6.1 有对模块/库/包更详细的解释。

一些标准库:

  1. random,生成伪随机数,进行抽样。
  2. math,进行取对数,开根号等数学运算。
  3. os,用于与操作系统交互,可以新建/删除/重命名文件夹,查看/改变工作目录。

一些第三方库:

  1. scikit-learn,实现了许多机器学习算法。
  2. numpy:多维数组和科学计算功能。
  3. pandas:数据处理和分析。
  4. requests:用几行代码就能发送HTTP网络请求进行网络爬虫,而不必处理复杂的网络协议。
  5. jieba:对中文文本进行分词。

2.1.2 环境

Python 环境是一个独立且隔离的 Python 运行时空间,包含特定版本的 Python 解释器、标准库以及用户安装的第三方包。 在 Python 环境中,所有的库和模块安装仅对该环境可见可用,与其他环境相互独立。

初学者使用最新的稳定版本的Python即可,进行具体项目时可能由于需要安装其他版本的Python。

注记比喻:环境就是厨房
  1. 做不同的菜肴,往往需要不同的工具与食材。

    (做不同的任务,需要不同的第三方库,Python版本)

    做中餐,常用酱油,醋,料酒,八角,香叶,柴火灶……

    做西餐,常用烤箱,料理机,黑胡椒,奶油,黄油,迷迭香……

  2. 由于种种原因,如场地有限,一个厨房不能容纳所有的料理工具和食材。

    (由于版本冲突原因,一个环境不能安装多个版本的Python,也不可能安装所有库包的所有版本)

  3. 为了做出多种风格的菜肴,需要准备多个厨房。

    (为了完成不同的任务,需要准备多个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。二者区别在于:

  1. Anaconda PowerShell Prompt 新建的环境默认在C盘,而 Anaconda Prompt 新建的环境默认在Anaconda的安装目录。
  2. Anaconda PowerShell Prompt的功能比Anaconda Prompt更多,更现代。

2.2 环境管理

  1. 创建环境

    在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 
图 2.1: 输入conda create命令后,conda会列出需要安装的包,询问你是否继续(Proceed)。输入y,回车,就能继续。
图 2.2: 输入y,回车后,显示各包的下载安装进度条。
图 2.3: 进度条全部走完后,创建环境完成。如果进度条全满后没有动静,敲击回车键可能可以看到完成界面。
  1. 激活与退出环境

    要在环境中安装、删除包,需要先激活该环境。

    conda activate命令激活环境,conda deactivate退出当前环境。

    当前激活的环境名称,在每行开头的括号中显示。打开anaconda prompt时,默认激活的是base环境。

Anaconda Prompt
# 命令
# 激活特定名称的环境
conda activate 环境名称
# 退出当前环境
conda deactivate

# 例子
# 激活名为tutorial的环境
conda activate tutorial
图 2.4: 激活环境后,环境名称会在路径前的圆括号中显示。
  1. 查看所有环境。
Anaconda Prompt
# 下面两个命令都可以查看现有的所有环境
conda info -e 
conda env list
图 2.5: 查看环境列表。当前所处的环境前面有星号*。
  1. 删除环境
Anaconda Prompt
# 命令
# 删除特定名称的环境
conda env remove -n 要删除的环境名称

# 例子
# 删除名为tutorial的环境
conda env remove -n tutorial 

2.3 包管理

  1. 安装包

    一般先用conda activate命令激活某个环境,然后用conda installpip 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.bz2
Anaconda 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-learn

conda会自动处理第三方库的依赖关系。安装过程会列出需要安装的包及其依赖的包,询问是否继续,输入y,回车继续。

pip是Python的标准软件包管理器,内置于Python发行版中,可以安装Python包索引PyPI中的包。 一些无法通过conda安装的包,可用pip安装,如jieba。

安装成功后,用conda list命令可查到环境中所有包或特定包的信息。

Anaconda Prompt
# 命令
# 查看当前环境中所有包的信息
conda list 
# 查看当前环境中特定包的信息
 conda list 包名称
# 例子
# 查看当前环境中pip包的信息
conda list pip
图 2.6: 查看当前环境中pip包的信息。
  1. 删除包
Anaconda Prompt
# 命令
# 卸载当前环境中的某个包
conda remove 包名称 

# 例子
# 卸载当前环境中的pandas库
conda remove pandas

删除过程中会列出要卸载的库,询问是否继续,输入y,回车继续。

一些包只能在Python的特定版本下工作,在Anaconda Prompt中用python -V查看当前环境安装的Python版本。

  1. 更新包

有时希望把旧版本的包升级到最新版本。

Anaconda Prompt
# 命令
# 用pip更新包
pip install --upgrade 包名称

# 用conda更新包
conda upgrade 包名称

2.4 其他问题

2.4.1 换源

channel是conda获取包的仓库,通常由社区、开发者或组织维护,包含大量用于不同编程语言和工具的软件包。 如果默认的channel链接不稳定,可配置一些国内好用的channel,如清华源。

  1. 打开隐藏文件.condarc

    .condarc一般位于当前用户的家目录(C:\Users\用户名)。 因为.condarc是隐藏文件,所以需要设定资源管理器显示隐藏的项目。

    Windows首次编辑.condarc文件时,需在Anaconda Prompt中运行conda config --set show_channel_urls yes ,以生成该文件。

在Windows资源管理器中查看隐藏的项目。
  1. 修改隐藏文件.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
  1. 在Anaconda Prompt中运行conda clean -iconda 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\envsD:\Anaconda3\pkgs

图 2.7: 编辑用户家目录下的condarc文件,设置环境存储路径和包存储路径。

上面两个路径可以按你的喜好修改,只是要注意:

  1. 路径中没有中文或空格。
  2. 该路径确实可以在你的计算机上创建。例如,如果你的计算机没有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包
图 2.8: ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: ...,信息指向一个whl文件。

2.4.4 启动Anaconda Prompt时报错

造成这一问题的原因应该有很多。下面举一个作者亲身经历的案例,案例中的原因是改变了base环境中的包版本,导致base环境无法启动。相关经验教训是:

  1. 不要改变base环境中包的版本
  2. 尽量为项目创建新的环境,在新的环境中安装需要的包,运行Python代码。

故事背景:用户发现周二晚上还能跑的爬虫代码,到周三就不能获取数据了,于是将爬虫代码发给AI排查问题。AI的结论是数据来源网站的API更换,最后也没有解决相关数据的获取。

周四,当用户启动AnacondaPrompt准备用Jupyter Notebook写点东西时,一大堆报错扑面而来,打了用户一个措手不及。

【兴师问罪的用户】

昨天你是不是对我的Python环境做了什么,我现在启动anaconda prompt,有报错,且(base)没有了,直接是显示路径


【冷静的小虾】

先说我能确认做过什么:

  1. 在你的 miniconda3 基础环境里执行过 pip install app-store-scraper(安装到 C:\Users\HUAWEI\miniconda3\Lib\site-packages
  2. 用隔离的 Python 3.13.12 创建了一个 venv(路径 C:\Users\HUAWEI\.workbuddy\binaries\python\envs\default),和 conda 完全分开
  3. 在那个 venv 里装了 requests

第1条有可能带来副作用,但通常 pip install 不会破坏 conda 的 prompt 显示。

要准确判断,需要你把报错信息贴给我看。

具体操作:打开 Anaconda Prompt,把显示的报错文字完整复制过来。常见的几种情况:

现象 可能原因
(base) 消失,直接显示路径 conda init 配置被改动,或 .bashrc/.bash_profile 出问题
CondaErrorCommandNotFoundError 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 练习

  1. 在自己的电脑上安装Miniconda。
  2. 新建一个环境,Python版本使用3.14。如果不知道这个环境要叫什么名字,用你自己的名字拼音。
  3. 在2中新建的环境中,安装包pandas。
  4. conda list pandas确认pandas包安装成功。

2.6 参考资料

Anaconda官网

清华源Anaconda软件仓库

修改conda默认envs_dirs和pkgs_dirs