使用 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