✏️每个Python项目都应该有自己的conda环境,以保持你的工作有组织、隔离、最新、可复制和可共享。尽管Anaconda Navigator提供了简单的指向和单击操作环境,但仍然应该学习一些命令行接口命令来完成控制。
之前我使用Anaconda Navigator GUI创建了my_first_env
现在用Anaconda Prompt 创建一个名为my_second_env的新conda环境。
conda create --name my_second_env python
当被问及是否要继续时,输入y。这会使用当前版本的Python创建一个新环境。
通过在命令末尾添加 --yes 或 -y 可禁用确认交互。如果使用自动化流程,这是有帮助的。但是在日常工作中应该避免使用它。
conda activate my_second_env
检查环境是否已创建并处于活动状态
conda env list
查看当前环境中安装的软件包列表
conda list
如安装一个特定版本的Python,比如3.8
conda create --name my_second_env python=3.8
验证下
conda activate my_second_env
conda list python
# packages in environment at C:\Users\17800\anaconda3\envs\my_second_env:
#
# Name Version Build Channel
python 3.8.18 h4de0772_0_cpython conda-forge
结果是Python 3.8最新的版本,比如3.8.18
获取准确的Python 3.8,在配置版本号时使用==
创建环境时安装多个包
conda create --name my_second_env python numpy pandas
numpy作为pandas依赖包会一同安装,但是卸载pandas时也会作为依赖包一同卸载。解决这个问题可以使用显式安装
要查看非活动环境的内容
conda list -n my_first_env
-n 是 --name 的缩写
默认情况下,创建的conda环境存储在你的Anaconda安装目录下的envs文件夹中。
可以将conda环境放在一个项目文件夹中,并将其命名为conda_env
conda create -p D:\anywhere_you_want\a_project\conda_env
只需要把--name(-n)替换为--prefix(-p)
安装路径会作为唯一标识代替环境名字
激活env文件夹外的conda环境
conda activate D:\anywhere_you_want\a_project\conda_env
将conda环境放在项目文件夹中有几个好处:
- 你可以立即确认项目是否使用了隔离环境
- 把环境、数据和Jupyter笔记之类的东西统一存储,使项目独立
- 对所有环境使用相同的名称,例如 conda_env,任何人都可以立即识别它们
与默认位置的环境一样,当使用conda env list 和 conda info命令时,新环境将显示出来,尽管它没有正式名称。
你应该同时安装项目所需的所有包,以确保没有依赖冲突
只在活动环境中安装包。当然,你可以通过--name或--目录路径从外部环境安装包,但这种方法是不可取的。这不仅会带来更多的麻烦,而且还会出现在错误的环境中安装包的风险。
在my_second_env添加两个包,Matplotlib和pillow
激活my_second_env
conda activate my_second_env
最好在安装时指定每个包的版本。这将帮助你在将来想要重新复制或共享项目时显式地捕获环境中的内容。
conda搜索matplotlib
conda search matplotlib
这将返回一个包含所有可用的Matplotlib版本的长列表。最右边的列表示通道信息。
# Name Version Build Channel
matplotlib 3.8.0 py311haa95532_0 pkgs/main
matplotlib 3.8.0 py312h2e8e312_2 conda-forge
matplotlib 3.8.0 py312haa95532_0 pkgs/main
matplotlib 3.8.0 py39h0d475fb_0 conda-forge
matplotlib 3.8.0 py39h0d475fb_1 conda-forge
matplotlib 3.8.0 py39h0d475fb_2 conda-forge
matplotlib 3.8.0 py39haa95532_0 pkgs/main
matplotlib 3.8.0 py39hcbf5309_0 conda-forge
matplotlib 3.8.0 py39hcbf5309_1 conda-forge
matplotlib 3.8.0 py39hcbf5309_2 conda-forge
matplotlib 3.8.1 py310h5588dad_0 conda-forge
matplotlib 3.8.1 py311h1ea47a8_0 conda-forge
matplotlib 3.8.1 py312h2e8e312_0 conda-forge
matplotlib 3.8.1 py39h0d475fb_0 conda-forge
matplotlib 3.8.1 py39hcbf5309_0 conda-forge
matplotlib 3.8.2 py310h5588dad_0 conda-forge
matplotlib 3.8.2 py311h1ea47a8_0 conda-forge
matplotlib 3.8.2 py312h2e8e312_0 conda-forge
matplotlib 3.8.2 py39h0d475fb_0 conda-forge
matplotlib 3.8.2 py39hcbf5309_0 conda-forge
pkgs/main是conda的default 通道,默认情况下设置为Anaconda Repository。
请注意默认通道有Matplotlib 3.8.0,而conda-forge通道有Matplotlib 3.8.2。
conda-forge上的包可能比默认通道上的包更新得更快,并且您可以在conda-forge上找到不在默认通道中的包。
再查一下pillow
# Name Version Build Channel
pillow 10.0.1 py39h045eedc_0 pkgs/main
pillow 10.0.1 py39h368b509_2 conda-forge
pillow 10.0.1 py39h6ef006c_0 conda-forge
pillow 10.0.1 py39h6ef006c_1 conda-forge
pillow 10.1.0 py310h1e6a543_0 conda-forge
pillow 10.1.0 py311h4dd8a23_0 conda-forge
pillow 10.1.0 py312he768995_0 conda-forge
pillow 10.1.0 py38hc375fad_0 conda-forge
pillow 10.1.0 py39h368b509_0 conda-forge
pillow 10.1.0 py39hf7d859a_0 conda-forge
conda-forge里面是10.1.0,default是10.0.1。
如果您没有指定通道,Anaconda将自动使用.condarcfile中通道配置列表顶部的通道。
查看通道列表
conda config --show channels
channels:
- conda-forge
- defaults
Anaconda将首先在conda-forge通道中查找包。如果你正在寻找的软件包位于最高优先级通道中,则将安装它,即使列表中的下一个通道中有更多最新版本可用。在这种情况下,如果没有指定版本或通道的情况下安装Matplotlib,你将最终获得可用的最新版本,因为conda-forge具有最高优先级。
在my_second_env中一起安装这两个包,matplotlib用最新版本,pillow使用指定版本10.0.1
conda install matplotlib pillow==10.0.1
验证安装
conda list matplotlib
# packages in environment at C:\Users\17800\anaconda3\envs\my_second_env:
#
# Name Version Build Channel
matplotlib 3.5.3 py38haa244fe_2 conda-forge
matplotlib-base 3.5.3 py38h3268a40_2 conda-forge
conda list pillow
# packages in environment at C:\Users\17800\anaconda3\envs\my_second_env:
#
# Name Version Build Channel
pillow 10.0.1 py38h045eedc_0
可以看到包的正确版本以及源代码通道。
pillow的版本在default和conda-forge两个通道都有,则优先使用了default 通道,这可以确定可用的包已经经过兼容性检查,从而使其成为“最安全”的替代方案。default通道将在“channel”列中显示为空白。
如果你想让conda在任何列出的通道中安装最新版本的软件包,你可以使用以下命令关闭通道优先级顺序:
conda config --set channel_priority:false
你可以通过使用--channel和通道名强制conda使用特定的通道(比如默认通道):
conda install -c defaults matplotlib
要获得该通道上可用的最新版本,您可以省略版本号,但不建议这样做。
更改配置文件中通道列表中的成员关系和顺序,可以使用--remove、--append和--prepend等参数。
一般来说,你会希望default通道在顶部,所以让我们先删除它,然后再添加它:
conda config --remove channels defaults
conda config --prepend channels defaults
如果无法通过Anaconda找到所需的包,尝试Python包索引(https://pypi.org/)。
当使用pip安装一个包,然后使用conda list命令时,该包的通道名称将是“pypi”。
如果希望在创建的每个环境中安装一个或一组基本包,可以编辑配置文件以自动添加它们。
例如,始终默认安装最高版本的Python
conda config --add create_default_packages python
现在,每次创建新的conda环境时,默认情况下都会包含Python。
如果你从事大量的数据科学工作,您可能还需要添加NumPy、pandas和一个绘图库。
查看默认的软件包列表:
conda config --show
要从默认包列表中删除一个包,请使用--remove来代替--add。
你也可以在命令提示符中用--no-default-packagesflag覆盖这个选项。
有关安装包和管理通道的更多信息,请访问https://docs.conda.io/and,分别搜索“installing with conda”和“managing channels”。
随着时间的推移,可能会出现新版本的已安装包。
通过运行以下命令(从任何地方)确保conda是最新的
conda update -n base conda
在活动环境中,检查特定包(如pip)的更新是否可用
conda update pip
如果有可用的更新,将向您显示新的包信息,例如它的版本、构建、内存需求和通道,并提示您接受或拒绝更新。
将活动环境中的所有软件包更新到当前版本
conda update –-all
尽管update命令尝试尽可能地更新所有内容,但它可能无法将所有包升级到最新版本。如果您的环境中存在冲突的约束,Anaconda可能会在更新时使用某些包的旧版本来满足依赖约束。
永远不要试图在base(root)环境中管理一组精确的包。
For more on these topics, see Anaconda | Keeping Anaconda Up To Date, https://docs.anaconda.com/anaconda/install/update-version/,and Anaconda | What's in a Name? Clarifying the Anaconda Metapackage
从活动环境中删除软件包,例如Matplotlib
conda remove matplotlib
需要同时删除多个包,请依次列出。
conda remove matplotlib pillow
要从非活动环境中删除相同的包,请使用--name(-n)标志提供环境的名称
⛔不鼓励以这种方式处理非活动环境,因为这会增加出错的机会。
通过克隆环境或使用列出环境内容的特殊文件来精确地复制环境,这使得与他人共享环境、存档环境或恢复已删除的版本变得容易。
克隆的环境,例如生成my_second_env_my_third_env的精确副本
create --name my_third_env --clone my_second_env
通过记录环境的内容来复制环境。环境文件是一个文本文件,其中列出了环境中安装的所有包和版本,包括使用pip安装的包和版本。这既可以帮助你恢复一个环境,也可以与他人分享。
环境文件是用YAML (.yml)编写的,这是一种人类可读的数据序列化格式,用于数据存储。
生成环境文件,必须激活并导出环境。
conda activate my_second_env
conda env export > env_expt.yml
⛔可以将该文件命名为任何有效的文件名,例如my_second_env。但是要小心,因为具有相同名称的现有文件将被覆盖。yml文件会出现在C:\Users\username\
环境文件只包含您显式要求的包(如Python),而不包含它们的依赖项。
解决依赖关系可能会引入可能不兼容于平台的包,因此不包括它们。
还记得我说过在安装包时指定版本号是最佳实践吗,即使您想要使用最新的版本。
使用环境文件重新创建环境。
conda env create -n my_second_env -f \directory\path\to\environment.yml
有关环境文件的更多信息,包括如何手动生成它们,请访问https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.xhtml#sharing-an-environment/
如果您的环境不包括使用pip安装的包,您还可以使用规范文件在相同的操作系统上重现conda环境。
要创建规范文件,需要激活一个环境,例如my_second_env
conda list --explicit > exp_spec_list.txt
这个文件可以用来创建一个环境:
conda create -n my_second_env -f \directory\path\to\exp_spec_list.txt
要查看可用版本列表,请先激活环境
conda list --revisions
2023-12-21 11:49:09 (rev 0)
+bzip2-1.0.8 (conda-forge/win-64)
+ca-certificates-2023.11.17 (conda-forge/win-64)
+libffi-3.4.2 (conda-forge/win-64)
+libsqlite-3.44.2 (conda-forge/win-64)
+libzlib-1.2.13 (conda-forge/win-64)
+openssl-3.2.0 (conda-forge/win-64)
+pip-23.3.2 (conda-forge/noarch)
+python-3.8.18 (conda-forge/win-64)
+setuptools-68.2.2 (conda-forge/noarch)
+tk-8.6.13 (conda-forge/win-64)
+ucrt-10.0.22621.0 (conda-forge/win-64)
+vc-14.3 (conda-forge/win-64)
+vc14_runtime-14.38.33130 (conda-forge/win-64)
+vs2015_runtime-14.38.33130 (conda-forge/win-64)
+wheel-0.42.0 (conda-forge/noarch)
+xz-5.2.6 (conda-forge/win-64)
2023-12-21 12:37:53 (rev 1)
xz {5.2.6 (conda-forge/win-64) -> 5.4.5 (defaults/win-64)}
+brotli-1.1.0 (conda-forge/win-64)
+brotli-bin-1.1.0 (conda-forge/win-64)
+certifi-2023.11.17 (conda-forge/noarch)
+cycler-0.12.1 (conda-forge/noarch)
+fonttools-4.47.0 (conda-forge/win-64)
+freetype-2.12.1 (conda-forge/win-64)
+icu-73.2 (conda-forge/win-64)
+intel-openmp-2024.0.0 (conda-forge/win-64)
+jpeg-9e (conda-forge/win-64)
+kiwisolver-1.4.5 (conda-forge/win-64)
+krb5-1.20.1 (conda-forge/win-64)
+lerc-3.0 (defaults/win-64)
+libblas-3.9.0 (conda-forge/win-64)
+libbrotlicommon-1.1.0 (conda-forge/win-64)
在修订列表中,包名称前的加号(+)表示已添加,减号(-)表示已卸载,名称前没有符号表示已更新。
要将环境恢复到以前的版本,例如rev 0
conda install --revision 0
or
conda install --rev 3
如果您恢复到较旧的版本,此版本将获得自己的编号,因此您仍然可以恢复到较早的版本。
例如,如果修订列表显示8个rev,而您恢复到rev 6,那么当您重新生成rev列表时,您将看到9个rev。rev 9将与rev 6相同。
如果环境已激活,先返回base(root)环境
conda deactivate
执行命令删除未激活的环境,将环境名称替换为ENVNAME:
conda remove -n ENVNAME --all
or
conda env remove -n ENVNAME --all
使用conda env list或者info验证:
conda info -e
被删除的环境应该已不在环境列表中。
对于Anaconda的envsfolder之外的环境,你需要包括目录路径:
conda remove -p PATH\ENVNAME --all
随着时间的推移,在创建和删除环境以及安装和卸载包时,anaconda3文件夹将消耗越来越多的磁盘空间。您可以通过清理包缓存来恢复其中的一些空间。要清除包缓存,请在任何环境下运行conda clean命令。
要预览它标记要删除的文件,您可以进行演练
conda clean --all --dry-run
Will remove 314 (1.12 GB) tarball(s).
Will remove 1 index cache(s).
Will remove 227 (2.58 GB) package(s).
There are no tempfile(s) to remove.
There are no logfile(s) to remove.
DryRunExit: Dry run. Exiting.
使用(非演练)
conda clean --all
Windows用户在运行此命令后需要重新启动。
有关运行conda clean的更多选项,请参阅https://docs.conda.io/projects/conda/en/latest/commands/clean.xhtml