使用 pyenv 和 pyenv-virtualenv 来管理 python 版本
pyenv 是个 shell 脚本,能够轻松得实现各个不同版本 python 的相互间切换,而且各个版本的 python 切换不限于全局切换,甚至不同文件夹都可以拥有不同的 python 版本。
pyenv-virtualenv 是 pyenv 的插件,为 pyenv 设置的 python 版本提供隔离的虚拟环境,设置虚拟环境后,在这个目录下面安装的第三方库及修改库搜索路径都不会影响其他环境,相当于一个沙盒环境,互相不影响。
pyenv
- 进行全局的 Python 版本切换
- 为单个项目提供对应的 Python 版本
- 只依赖 Python 本身
- 能够进行 virtualenv 管理
- 提供下载不同的 Python 版本和衍生版本
使用 pyenv --help 查看具体命令
安装
确定你想把
pyenv安装在哪。推荐安装在$HOME/.pyenv,但你也可以安装在任意位置$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv定义你
PYENV_ROOT的环境变量来指定你把pyenv仓库克隆到了哪,并把$PYENV_ROOT/bin添加到你的$PATH中,这样就能在命令行使用pyenv命令$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc设置启动 shell 时自动加载
pyenv脚本。在 shell 配置文件的最后面加上eval "$(pyenv init -)"$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc重启 shell,使脚本生效
$ exec "$SHELL"安装不同的
python版本到$(pyenv root)/versions文件夹
在pyenv安装之前的所有python版本都归为system版本。可以用pyenv versions查看当前安装的python版本)。
在安装python之前,可以使用pyenv install -l查看当前可以安装哪些python版本。
然后使用pyenv install 选择的版本来安装你所选择的python版本。比如pyenv install 3.6.1安装python官网的版本。
基本操作
pyenv versions查看当前已安装的 python 版本pyenv install ...安装指定版本的 pythonpyenv global python 版本切换全局 python 版本pyenv local python 版本切换当前文件夹下的 python 版本pyenv shell python 版本切换当前 shell 中的 python 版本pyenv version查看当前使用的 python 版本
安装指定版本
pyenv install 命令在安装的时候是下载源代码到本地编译安装的,所以需要安装相关的开发库及依赖包
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev
$ sudo apt install libedit-dev
安装指定版本
$ pyenv install 2.7.14
Downloading Python-2.7.14.tar.xz...
-> https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
error: failed to download Python-2.7.14.tar.xz
BUILD FAILED (Ubuntu 17.10 using python-build 1.2.7-7-g21c75c19)
解决方法
pyenv install fails at download stage
$ cat /tmp/python-build.20181008151222.32112.log
/tmp/python-build.20181008151222.32112 ~/.pyenv
curl: (1) Protocol "https" not supported or disabled in libcurl
$ wget https://curl.haxx.se/download/curl-7.61.1.tar.gz
$ tar xf curl-7.61.1.tar.gz
$ cd curl-7.61.1
$ ./configure --with-ssl & make & sudo make install
$ curl --version
curl 7.61.1 (x86_64-pc-linux-gnu) libcurl/7.61.1 OpenSSL/1.0.2g zlib/1.2.11
Release-Date: 2018-09-05
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy
安装完成之后需要刷新数据库
pyenv rehash
安装 python2 和 python3
$ pyenv install -l
$ pyenv install 2.7.14
$ pyenv install 3.6.6
$ pyenv versions
* system (set by /home/yanwzh/.pyenv/version)
2.7.14
3.6.6
卸载指定版本
pyenv uninstall x.x.x
版本切换
- 全局版本切换
pyenv global 2.7.14 - 局部版本切换
pyenv local 3.6.6#在某目录下执行,只在该目录下生效 - 取消当前设置的版本使用
pyenv local --unset
例如设置指定文件夹为 3.6.6
$ mkdir 3.6.6
$ pyenv local
pyenv: no local version configured for this directory
$ pyenv local 3.6.6
$ pyenv local
3.6.6
$ python
Python 3.6.6 (default, Oct 8 2018, 15:46:38)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
$ cd ..
$ python
Python 2.7.14 (default, Sep 23 2017, 22:06:14)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
$ cd -
$ pyenv local --unset
$ python
Python 2.7.14 (default, Sep 23 2017, 22:06:14)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
更新 pyenv
$ cd $(pyenv root)
$ git pull
卸载 pyenv
- 禁用
pyenv, 把pyenv init从 shell 的配置文件中移除,然后重启 shell (移除后pyenv命令仍然能使用,但是版本切换命令不会生效) - 卸载
pyenv, 执行上一步,然后把pyenv的根目录删除即可
pyenv-virtualenv
安装
- 需要将
pyenv-virtualenv克隆到pyenv的plugin文件夹下$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv - (OPTIONAL) 添加
pyenv virtualenv-init到你的shell配置文件中,这样进入指定文件夹自动进入虚拟环境,离开文件夹退出虚拟环境$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc exec "$SHELL"
创建虚拟环境
pyenv virtualenv x.x.x name
如果不指定版本 x.x.x , 则默认使用当前 pyenv version 的 python 版本
创建的虚拟环境位于 $(pyenv root)/versions/ 下的指定 python 版本的文件夹中 envs/ 文件夹下
激活虚拟环境
自动激活
- 在
.zshrc添加eval "$(pyenv virtualenv-init -)",然后exec "$SHELL"重启 shell - 在想要激活虚拟环境的文件夹中新建
.python-version文件,并写入虚拟环境的名字 - 以后进入该的文件夹就会自动激活虚拟环境,离开该文件夹就会退出虚拟环境。
手动激活
pyenv activate name激活虚拟环境。pyenv deactivate退出虚拟环境
删除虚拟环境
- 删除
$(pyenv root)/versions和$(pyenv root)/versions/{version}/envs的相关文件夹即可 - 命令行运行
pyenv uninstall name
列出现有 virtualenvs
$ pyenv virtualenvs
3.6.6/envs/P-env-3.6.6 (created from ~/.pyenv/versions/3.6.6)
* P-env-3.6.6 (created from ~/.pyenv/versions/3.6.6)
每个 virtualenv 有两个条目,较短的一个只是一个符号链接
Example
$ pyenv virtualenv 3.6.6 P-env-3.6.6
$ mkdir 3.6.6
$ cd 3.6.6
$ touch .python-version
$ echo P-env-3.6.6 > .python-version
$ pyenv local
P-env-3.6.6