多版本管理
Pyenv
当系统中需要多个python版本,每次都手动编译安装,就太过于麻烦。
我们可以借助pyenv
,根据需求在系统里安装和管理多个 Python 版本
- 配置当前用户的python的版本
- 配置当前shell的python版本
- 配置某个项目(目录及子目录)的python版本
- 配置多个虚拟环境
工作原理介绍
pyenv是利用系统环境变量PATH的优先级,劫持python的命令到pyenv上,根据用户所在的环境或目录,使用不同版本的python。
对于系统环境变量 PATH ,里面包含了一串由冒号分隔的路径,例如 /usr/local/bin:/usr/bin:/bin
。每当在系统中执行一个命令时,例如 python
或 pip
,操作系统就会在 PATH 的所有路径中从左至右依次寻找对应的命令。因为是依次寻找,因此排在左边的路径具有更高的优先级。
在PATH 最前面插入一个 $(pyenv root)/shims
目录,$(pyenv root)/shims
目录里包含名称为python
以及pip
等可执行脚本文件;当用户执行python
或pip
命令时,根据查找优先级,系统会优先执行shims
目录中的同名脚本。pyenv
正是通过这些脚本,来灵活地切换至我们所需的Python版本。
更详细的资料,可以查看
pyenv
的文档介绍或者源码实现。
pyenv的安装
安装依赖
Debian/Ubuntu/Linux Mint
sudo apt install curl git-core gcc make zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libssl-dev
CentOS/RHEL
yum -y install epel-release
yum install git gcc zlib-devel bzip2-devel readline-devel sqlite-devel openssl-devel
安装pyenv
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# 或者手动下载
export PYENV_ROOT=${HOME}/.pyenv
export GITHUB=https://github.com/
git clone ${GITHUB}pyenv/pyenv.git ${PYENV_ROOT}
git clone ${GITHUB}pyenv/pyenv-doctor.git ${PYENV_ROOT}/plugins/pyenv-doctor
git clone ${GITHUB}pyenv/pyenv-update.git ${PYENV_ROOT}/plugins/pyenv-update
git clone ${GITHUB}pyenv/pyenv-virtualenv.git ${PYENV_ROOT}/plugins/pyenv-virtualenv
将环境变量追加到
~/.bashrc
,如果是zsh,则追加到~/.zshrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
echo '# 指定python源码下载地址' >> ~/.zshrc
echo 'export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1' >> ~/.zshrc
echo 'export PYTHON_BUILD_MIRROR_URL="https://registry.npmmirror.com/-/binary/python"' >> ~/.zshrc
在终端执行如下命令,使其立即生效
source ~/.zshrc
Pyenv命令
查看pyenv版本
pyenv --version
pyenv 2.3.9
安装python
查看可安装的python的版本
pyenv install -–list
安装python
pyenv install 3.9.15
卸载python
pyenv uninstall 3.9.15
查看使用的python版本
查看所有python版本
pyenv versions
system
* 3.9.13 (set by /Users/liusf/.pyenv/version)
查看当前使用的python版本
pyenv version
3.9.13 (set by /Users/liusf/.pyenv/version)
管理python版本
pyenv global <version>
:配置当前用户的系统使用的python版本
$ python -V
Python 2.6.6
$ pyenv global 3.6.4
$ python -V
Python 3.6.4
$ exit
logout
#重新登录
$ python -V
Python 3.6.4
pyenv shelll <version>
:配置当前shell的python版本,退出shell则失效
$ python -V
Python 2.6.6
$ pyenv shell 3.5.4
$ python -V
Python 3.5.4
# 当前shell下,取消配置的使用python shell --unset;若退出此shell,配置也会失效。
$ pyenv shell --unset
pyenv local <version>
:配置所在项目(目录)的python版本
# 新建一个文件夹~/project,设置python版本
$ mkdir project
$ cd project
$ pyenv local 3.5.4
# 在此目录下,查看版本
$ python -V
Python 3.5.4
# 退出目录,仍然是之前的python版本
$ cd ~
$ python -V
Python 3.6.4
虚拟环境pyenv-virtualenv
使用pyenv install安装的python版本,比如3.6.4;解释器安装的路径为~/.pyenv/versions/3.6.4/
;插件的安装的路径为~/.pyenv/versions/3.6.4/lib/python3.6/site-packages
;
使用pyenv-virtualenv创建python虚拟环境,实质上是在~/.pyenv/versions/3.6.4/
下创建一个文件夹evns,存放该虚拟环境python的解释器;并且在~/.pyenv/
下创建一个软连接,该虚拟环境可以通过pyenv进行管理;
$ pyenv virtualenv 3.6.4 my_3.6.4
Requirement already satisfied: setuptools in /home/python/.pyenv/versions/3.6.4/envs/my_3.6.4/lib/python3.6/site-packages
Requirement already satisfied: pip in /home/python/.pyenv/versions/3.6.4/envs/my_3.6.4/lib/python3.6/site-packages
$ ll ~/.pyenv/versions/
total 8
drwxr-xr-x 6 python python 4096 Jul 20 00:59 3.5.4
drwxr-xr-x 7 python python 4096 Jul 21 01:03 3.6.4
lrwxrwxrwx 1 python python 48 Jul 21 01:03 my_3.6.4 -> /home/python/.pyenv/versions/3.6.4/envs/my_3.6.4
查看python虚拟环境
$ pyenv virtualenvs
3.6.4/envs/my_3.6.4 (created from /home/python/.pyenv/versions/3.6.4)
my_3.6.4 (created from /home/python/.pyenv/versions/3.6.4)
切换到python虚拟环境
$ pyenv shell my_3.6.4
(my_3.6.4) [python@localhost 3.6.4]$
(my_3.6.4) [python@localhost 3.6.4]$ pyenv versions
system
3.5.4
3.6.4
3.6.4/envs/my_3.6.4
* my_3.6.4 (set by PYENV_VERSION environment variable)
除此之外,还可以使用另一种方式切换到虚拟环境
pyenv activate my_3.6.4
pyenv deactivate
删除虚拟环境则使用以下命令
pyenv uninstall my_3.6.4
pyenv virtualenv-delete my_3.6.4
Anaconda
Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。
Anaconda通过管理工具包、开发环境、Python版本,大大简化了你的工作流程。不仅可以方便地安装、更新、卸载工具包,而且安装时能自动安装相应的依赖包,同时还能使用不同的虚拟环境隔离不同要求的项目。
Anaconda 安装包可以到https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载。
Miniconda 是一个 Anaconda 的轻量级替代,默认只包含了 python 和 conda,但是可以通过 pip 和 conda 来安装所需要的包。
Miniconda 安装包可以到 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 下载。
安装
下载选定的Anaconda
版本到指定目录,然后执行该文件,然后输入yes,一路回车即可。
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh
将环境变量追加到~/.bashrc
,如果是zsh,则追加到 ~/.zshrc
echo "export PATH=~/anaconda3/bin:$PATH" >> ~/.zshrc
在终端执行如下命令,使其立即生效
source ~/.zshrc
修改镜像源
Anaconda默认访问国外服务器,网速较慢,故需要修改默认镜像
TUNA 还提供了 Anaconda 仓库与第三方源(conda-forge、msys2、pytorch等,查看完整列表)的镜像,各系统都可以通过修改用户目录下的 .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
Windows 用户无法直接创建名为 .condarc
的文件,可先执行 conda config --set show_channel_urls yes
生成该文件之后再修改。
基本使用
管理环境
检查版本
conda --version
升级版本
conda update conda
管理(虚拟)环境
# 创建一个名为python37的环境,指定Python版本是3.7(不用管是3.7.x,conda会为我们自动寻找3.7.x中的最新版本)
conda create --name python37 python=3.7
# 安装好后,使用activate激活某个环境
activate python37 # for Windows
source activate python37 # for Linux & Mac
# 激活后,会发现terminal输入的地方多了python37的字样
# 如果想返回默认的python环境,运行
deactivate python37 # for Windows
source deactivate python37 # for Linux & Mac
# 删除一个已有的环境
conda remove --name python37 --all
# 另外,我们可以使用conda命令替换source命令用来激活和关闭环境
conda activate python37
conda deactivate
# 取消每次打开终端,默认激活bash环境
conda config --set auto_activate_base false
# 重新激活每次打开终端,默认进入base环境
conda config --set auto_activate_base true
新的开发环境会被默认安装在你conda目录下的envs文件目录下。
如果我们没有指定安装python的版本,conda会安装我们最初安装conda时所装的那个版本的python。
列出所有环境
conda info -e
conda info –-envs
注意:conda会对当前活动的环境追加星号标记。
macdeMacBook-Pro:~ mac$ conda info -e
# conda environments:
#
base * /Users/mac/anaconda3
myenv /Users/mac/anaconda3/envs/myenv
py3 /Users/mac/anaconda3/envs/py3
复制一个环境
通过克隆来复制一个环境。这儿将通过克隆py3来创建一个称为py32的副本。
conda create -n py32 --clone py3
通过
conda info –-envs
来检查环境。
重命名env
conda是没有重命名环境的功能的, 要实现这个基本需求, 只能通过愚蠢的克隆-删除的过程。
切记不要直接mv移动环境的文件夹来重命名, 会导致一系列无法想象的错误的发生!
conda create --name newname --clone oldname # 克隆环境
conda remove --name oldname --all # 彻底删除旧环境
分享环境
如果你想把你当前的环境配置与别人分享,这样ta可以快速建立一个与你一模一样的环境(同一个版本的python及各种包)来共同开发/进行新的实验。
一个分享环境的快速方法就是给ta一个你的环境的.yml文件。
首先通过activate target_env要分享的环境target_env,然后输入下面的命令会在当前工作目录下生成一个environment.yml文件
conda env export > environment.yml
小伙伴拿到environment.yml文件后,将该文件放在工作目录下,可以通过以下命令从该文件创建环境
conda env create -f environment.yml
移除环境
我们不再需要snakes环境了,可以输入以下命令:
conda remove -n myenv --all
管理包
conda安装和管理python包非常方便,可以在指定的python环境中安装包,且自动安装所需要的依赖包,避免了很多拓展包冲突兼容问题。
不建议使用easy_install安装包。大部分包都可以使用conda安装,无法使用conda和anaconda.org安装的包可以通过pip命令安装
使用合适的源可以提升安装的速度
查看已安装包
conda list
使用这条命令来查看哪个版本的python或其他程序安装在了该环境中,或者确保某些包已经被安装了或被删除了。
向指定环境安装包
我们在指定环境中安装requests包,有两种方式:
通过环境名安装
直接通过-n
选项指定安装环境的名字
conda install --name py3 requests
提示:你必须告诉conda你要安装环境的名字(-n py3)否则它将会被安装到当前环境中。
激活py3环境,再使用conda install命令。
conda activate py3
conda install requests
通过pip命令安装
对于那些无法通过conda安装或者从Anaconda.org获得的包,我们通常可以用pip命令来安装包。
可以上pypi网站查询要安装的包,查好以后输入pip install命令就可以安装这个包了。
我们激活想要放置程序的python环境,然后通过pip安装一个叫“PyMysql”的包。
# Linux, OS X
source activate bunnies
# Windows
activate py3
# 安装
pip install pymysql
pip只是一个包管理器,所以它不能为你管理环境。pip甚至不能升级python,因为它不像conda一样把python当做包来处理。但是它可以安装一些conda安装不了的包。
小技巧:在任何时候你可以通过在命令后边跟上-help来获得该命令的完整文档。很多跟在–后边常用的命令选项,可以被略写为一个短线加命令首字母。所以–name选项和-n的作用是一样的。通过conda -h或conda –-help来看大量的缩写。
移除包
假设你决定不再使用包pymysql。你可以在py3环境中移除它。
conda remove -n py3 pymysql