目录
Pip和Conda的一些疑难杂症
python有两种常使用的包管理工具,一个是pip
,另一个是conda
。
Conda
conda
类似于linux有着不同的发行版:Anaconda以及Miniconda,二者都包含了conda,都可以使用conda的功能。只是Miniconda比Anaconda少包含了一些第三方包。可以将Miniconda理解为Python + conda
,即其提供了一个python环境,通常情况下这个python环境的名称为base
,并且包含了一个conda
来管理Python环境,即可以使用conda
命令来创建、修改Python环境。
而Anaconda可以看做是Python + conda + meta packages
即Miniconda + meta packages
,其除了提供Miniconda包含的python环境以及conda管理工具之外,还会额外的下载一些可能会被用到的包,这些包都会被下载到base
环境中。
在执行conda命令时,本质上是在执行一个二进制命令,或者可执行文件,例如windows下就是conda.exe
,但是这个可执行文件中的核心逻辑是Python编写的,并且可能会执行Python代码,因此还是需要一个python解释器,并且这个解释器是base环境中的解释器。
接下来我们就验证这一点:
# 在正常情况下,执行创建环境命令会成功
conda create -n py_1
conda env list
base * D:\Development\Anaconda
auto D:\Development\Anaconda\envs\auto
autoui D:\Development\Anaconda\envs\autoui
kwgraph D:\Development\Anaconda\envs\kwgraph
py_1 D:\Development\Anaconda\envs\py_1
torch D:\Development\Anaconda\envs\torch
# 当删除掉Anaconda下的python.exe后,执行创建环境命令,发现会失败
# 这说明了conda是依赖于base环境下的解释器的,也就是说base环境最好是不要修改和删除的
conda create -n py_2
Unable to create process using 'D:\Development\Anaconda\python.exe D:\Development\Anaconda\Scripts\conda-script.py create -n py_2'
# 当恢复python.exe后,便可成功创建环境
conda create -n py_2
Solving environment: done
下载
如果想要下载Anaconda,可以进入官网https://www.anaconda.com/,然后在页面中点击“下载”按钮,根据操作系统来选择不同的安装包。Windows的安装及其简单,只需要不停地点击“下一步”即可。对于Linux,Anaconda提供了一个sh文件来下载,因此可以先将该文件保存到主机上,然后运行下载:
# 使用curl命令将文件保存到本地
curl -O https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh
# 然后执行该sh文件进行下载
sh ./Anaconda3-2021.11-Linux-x86_64.sh (或者添加可执行权限后,直接运行./Anaconda3-2021.11-Linux-x86_64.sh)
# 经过一些选项之后,会开始一个比较漫长的下载安装过程,其中在某个阶段会询问
# Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no]
# 如果回答yes的话,首先会将conda的环境变量添加到shell启动脚本中,并且以后打开新的终端时,会自动激活conda,即打开新的终端时,都会进入base环境
# 其是通过修改.bashrc文件实现的,会在其最后添加以下代码:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/huang/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/home/huang/anaconda3/etc/profile.d/conda.sh" ]; then
. "/home/huang/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/home/huang/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
具体来说,首先conda执行__conda_setup="$('/home/huang/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)",即执行 /home/huang/anaconda3/bin/conda shell.bash hook 2> /dev/null 命令,并将结果赋给__conda_setup
接着[ $? -eq 0 ] 判断上个命令是否成功执行,如果成功执行那么便运行 __conda_setup 中的命令,该命令会让终端自动激活conda环境,并且设置环境变量
如果命令失败了,就会尝试别的方式,如果别的方式也失败了,那么就只配置环境变量
anaconda主页上列举的是最新的版本,如果想要找历史的版本,就需要进入https://repo.anaconda.com/archive/找到对应的版本进行下载。该网址可以从anaconda的文档中找到。
环境位置
当使用Anaconda创建一个新的环境时,会在Anaconda目录下的envs
目录创建一个对应的与环境名相同的文件夹名。在Windows下,通常会在Anaconda目录下的envs目录下,而base环境直接在Anaconda目录下
# 使用conda env list可以查看当前创建的所有环境以及环境所在的位置
# 可以看到base环境就在Anaconda下
conda env list
# conda environments:
base * D:\Development\Anaconda
auto D:\Development\Anaconda\envs\auto
autoui D:\Development\Anaconda\envs\autoui
kwgraph D:\Development\Anaconda\envs\kwgraph
py_1 D:\Development\Anaconda\envs\py_1
torch D:\Development\Anaconda\envs\torch
在指定目录下创建环境
如果想在指定位置下创建环境,可以使用conda create --prefix /path/env python=3.8
或者conda create -p /path/env python=3.8
,但是该选项不能和-n
一起使用:
# 在当前envs2文件夹下创建py_2环境
(py_1) huang@linux:~/downloads$ conda create -p ./envs2/py_2
# 当我们查询环境时,会发现确实创建成功了py_2环境,但是其没有对应的名称
(py_1) huang@linux:~/downloads$ conda env list
# conda environments:
#
base /home/huang/anaconda3
py_1 * /home/huang/anaconda3/envs/py_1
/home/huang/downloads/envs2/py_2
# 需要使用路径名作为环境名来激活
(base) huang@linux:~$ conda activate /home/huang/downloads/envs2/py_2
(/home/huang/downloads/envs2/py_2) huang@linux:~$ pip install tqdm
# 可以看到该环境下的第三方包也存放在lib/pythonx.x/site-packages中
(/home/huang/downloads/envs2/py_2) huang@linux:~$ (/home/huang/downloads/envs2/py_2) huang@linux:~$ ls ./downloads/envs2/py_2/lib/python3.12/site-packages/
README.txt pip setuptools tqdm-4.65.0.dist-info
_distutils_hack pip-23.3.1-py3.12.egg-info setuptools-68.2.2-py3.12.egg-info wheel
distutils-precedence.pth pkg_resources tqdm wheel-0.41.2.dist-info
# -p不能和-n一起使用
(/home/huang/downloads/envs2/py_2) huang@linux:~$ conda create -p ./good -n g2
usage: conda create [-h] [--clone ENV] [-n ENVIRONMENT | -p PATH] [-c CHANNEL] [--use-local] [--override-channels]
[--repodata-fn REPODATA_FNS] [--strict-channel-priority] [--no-channel-priority]
[--no-deps | --only-deps] [--no-pin] [--copy] [-C] [-k] [--offline] [-d] [--json] [-q] [-v] [-y]
[--download-only] [--show-channel-urls] [--file FILE] [--no-default-packages] [--dev]
[package_spec ...]
conda create: error: argument -n/--name: not allowed with argument -p/--prefix
包位置
在windows下,base
环境的第三方包会在Anaconda/Lib/site-packages
下,其它环境的第三方包会在Anaconda/envs/<env_name>/Lib/site-packages
下。而在Linux下,base
环境的第三方包会在Anaconda/Lib/pythonx.x/site-packages
下,其它环境的第三方包会在Anaconda/envs/<env_name>/lib/pythonx.x/site-packages
下。
并且在该目录下,我们可以看到很多包,例如tqdm
文件夹,就对应了我们下载的tqdm
包。但除此之外,我们还能发现有以包名开头,.dist-info
结尾的文件夹,例如tqdm-4.66.1.dist-info
。这个分发信息目录**(如tqdm-4.66.1.dist-info
)包含包的元数据和分发信息。这个目录是安装工具用来跟踪包版本、依赖关系、安装的文件以及其他包相关信息(如许可证、作者信息等)的方式。这个目录通常包含以下文件:
METADATA
或PKG-INFO
:包含包的元数据,如名称、版本、作者、许可证等。RECORD
:列出包安装的所有文件及其哈希值。INSTALLER
:标识安装此包的工具(如pip)。WHEEL
:如果包是作为wheel分发的,此文件包含wheel相关的元信息。top_level.txt
:指示包的顶层模块或包名。entry_points.txt
:定义包提供的任何入口点,如控制台脚本。
使用不同的channels
conda默认使用default
作为conda包的来源,我们可以修改其来源来更快或者找到有某个包的channels。
-
在命令中添加
-c
,在使用conda install
命令时,我们可以添加一个或多个-c
来指定不同的channels,conda会按照顺序寻找channels来下载包conda install numpy -c conda-forge -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
-
通过修改conda中的配置来实现:
# 默认只有defaults conda config --show channels channels: - defaults # 可以使用命令添加channels conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels conda-forge # 如果我们只执行conda config --add channels conda-forge,便会发现新添加的作为channels的首选 conda config --show channels channels: - conda-forge - defaults
python和python3的区别
在conda创建的环境中,包括在原生python中,会存在两个命令来使用python解释器,一个是python
,另一个就是python3
。之所以会存在两个python命令,是因为在早期系统中会安装python2和python3两个解释器,其中python
是指向python2解释器的,而python3是指向python3解释器的。而随着时间的推移,目前系统几乎没有使用python2解释器的了,但是使用python和python3的习惯保留了下来。目前python和python3通常都是指向同一个解释器:
# 可以看到base环境中python和python3同时指向python3.9,python3.9才是真正的解释器
(base) huang@linux:~$ ls -lh ~/anaconda3/bin | grep python
lrwxrwxrwx 1 huang huang 9 Feb 10 17:30 python -> python3.9
lrwxrwxrwx 1 huang huang 9 Feb 10 17:30 python3 -> python3.9
# 在py_1环境中,python和python3也指向同一个解释器
(base) huang@linux:~$ conda activate py_1
(py_1) huang@linux:~$ ls -lh ~/anaconda3/envs/py_1/bin | grep python
lrwxrwxrwx 1 huang huang 10 Feb 11 07:38 python -> python3.12
lrwxrwxrwx 1 huang huang 10 Feb 11 07:38 python3 -> python3.12
也就是说使用python和python3是等价的。
Pip
如果在linux中不存在pip
,那么就需要使用sudo apt install python3-pip
安装一个对应python3版本的pip。pip有两种存在形式,一种是二进制命令形式,另一种是在python的包中,所以也可以使用python -m pip
来下载包。
然后输入pip --version
查看pip对应的python解释器版本,例如pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
就说明pip是为python3.10解释器服务的。
如果主机中有多个python解释器,可以使用pythonx.x -m pip
来让pip为特定的python解释器服务。
注意:如果主机中是使用pythonx.x来调用解释器,而使用python或python3不可以的话,可以通过sudo apt install python-is-python3
来安装一个包,其会创建名为python和python3的两个软连接指向pythonx.x。
当使用anaconda创建环境时指定了python版本,会在安装python的同时安装pip。
查看可以下载的包的版本
-
使用
pip index versions <package_name>
可以查看当前源可以下载的包的版本:pip index versions torch WARNING: pip index is currently an experimental command. It may be removed/changed in a future release without prior warning. torch (1.10.2) Available versions: 1.10.2, 1.10.1, 1.10.0, 1.9.1, 1.9.0, 1.8.1, 1.8.0, 1.7.1, 1.7.0
使用不同镜像源
-
一种直接的方式就是使用
pip install -i <image_url>
,在下载的时候指定镜像源; -
另外一种方式就是修改配置文件,修改镜像源,这样以后下载的时候不需要指定镜像源也会使用配置文件中的镜像源:
-
对于Windows系统,需要在家目录下创建
pip/pip.ini
-
对于Linux系统,需要再家目录下创建
.pip/pip.conf
-
然后在文件中添加以下配置:
[global] # 其中index-url对应的值为镜像地址 index-url = https://pypi.tuna.tsinghua.edu.cn/simple # extra-index-url为额外的镜像地址 extra-index-url = https://pypi.org/simple extra-index-url = https://another-mirror.example.com/simple
-
查询包的版本
可以直接使用conda search <package_name>
来寻找包可以下载的版本,也可以额外添加-c
选项来获得某些channels对应的版本。
pip install -e 的作用
-
pip install -e /path/to/package_directory
可以以编辑模式来安装一个包,也称为“editable”安装,pip会将package_directory用一个符号链接来链接到site-packages目录中,即Python解释器可以找到包的地方。 -
当对源码包进行修改时,修改会立刻反映在项目中,而不需要重新安装包。如果删除该源码包,那么在site-packages中也将找不到该包了。
-
如果安装的是github上的包
pip install -e git+https://github.com/user/package.git#egg=package
,那么会先在本地创建一个副本,然后再创建一个符号链接。
注意事项 & 常见问题
-
当常见conda环境的时候,最好添加上python的版本,例如
conda create -n py_name python=3.9
,这样conda会在环境下创建bin目录,并且安装上pip等软件。如果没有安装的话,执行python
命令时,使用的会是系统的python命令,而不是环境中的命令。 -
当创建好一个新环境env_new并激活后,使用
pip list
命令打印的是默认环境(base)的包。- 原因:可能是因为是在base环境下输入了激活命令
conda activate env_new
,这样使用的pip打印的会是base环境的包。在linux系统中,使用which pip -a 可以看到所有pip命令所在的位置,通常上述情况发生时,pip命令所在位置会是base环境。 - 解决方法:在激活环境时,退出base环境,即在base环境下输入
conda deactivate
,使得系统不在任何一个环境,然后再激活新环境conda activate env_new
即可,再次输入which pip -a
来检查pip是否处在新环境中。
- 原因:可能是因为是在base环境下输入了激活命令
-
当使用pip安装包时遇到SSL相关的错误时,可以先考虑将pip版本升级到最新:
python -m pip install --upgrade pip
。如果还是不行,可以考虑将代理由https转为http:# 对于 HTTP 代理 export HTTP_PROXY="http://代理地址:端口" export HTTPS_PROXY="http://代理地址:端口"
-
报错ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch:检查是否是python版本的问题,例如python版本过高或过低导致没有对应的python版本的包
-
当报超时错误时:可以尝试添加–timeout 60选项,允许pip命令等待60秒,注意这个等待时间是总共的等待时间,如果文件较大的话,等待时间应该设置的也较大。