0%

pyenv-and-pyenv-virtualenv

使用 pyenvpyenv-virtualenv 来管理 python 版本

pyenv 是个 shell 脚本,能够轻松得实现各个不同版本 python 的相互间切换,而且各个版本的 python 切换不限于全局切换,甚至不同文件夹都可以拥有不同的 python 版本。

pyenv-virtualenvpyenv 的插件,为 pyenv 设置的 python 版本提供隔离的虚拟环境,设置虚拟环境后,在这个目录下面安装的第三方库及修改库搜索路径都不会影响其他环境,相当于一个沙盒环境,互相不影响。

pyenv

  • 进行全局的 Python 版本切换
  • 为单个项目提供对应的 Python 版本
  • 只依赖 Python 本身
  • 能够进行 virtualenv 管理
  • 提供下载不同的 Python 版本和衍生版本

使用 pyenv --help 查看具体命令

安装

  1. 确定你想把 pyenv 安装在哪。推荐安装在 $HOME/.pyenv,但你也可以安装在任意位置

    $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
  2. 定义你 PYENV_ROOT 的环境变量来指定你把 pyenv 仓库克隆到了哪,并把 $PYENV_ROOT/bin 添加到你的 $PATH 中,这样就能在命令行使用 pyenv 命令

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
  3. 设置启动 shell 时自动加载 pyenv 脚本。在 shell 配置文件的最后面加上 eval "$(pyenv init -)"

    $ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
  4. 重启 shell,使脚本生效

    $ exec "$SHELL"
  5. 安装不同的 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 ... 安装指定版本的 python
  • pyenv global python 版本 切换全局 python 版本
  • pyenv local python 版本 切换当前文件夹下的 python 版本
  • pyenv shell python 版本 切换当前 shell 中的 python 版本
  • pyenv version 查看当前使用的 python 版本

安装指定版本

pyenv install 命令在安装的时候是下载源代码到本地编译安装的,所以需要安装相关的开发库及依赖包

pyenv wiki

$ 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

安装 python2python3

$ 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

  1. 禁用 pyenv , 把 pyenv init 从 shell 的配置文件中移除,然后重启 shell (移除后 pyenv 命令仍然能使用,但是版本切换命令不会生效)
  2. 卸载 pyenv , 执行上一步,然后把 pyenv 的根目录删除即可

pyenv-virtualenv

安装

  1. 需要将 pyenv-virtualenv 克隆到 pyenvplugin 文件夹下
    $ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
  2. (OPTIONAL) 添加 pyenv virtualenv-init 到你的 shell 配置文件中,这样进入指定文件夹自动进入虚拟环境,离开文件夹退出虚拟环境
    $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
  3. exec "$SHELL"

创建虚拟环境

  • pyenv virtualenv x.x.x name

如果不指定版本 x.x.x , 则默认使用当前 pyenv version 的 python 版本

创建的虚拟环境位于 $(pyenv root)/versions/ 下的指定 python 版本的文件夹中 envs/ 文件夹下

激活虚拟环境

自动激活

  1. .zshrc 添加 eval "$(pyenv virtualenv-init -)",然后 exec "$SHELL" 重启 shell
  2. 在想要激活虚拟环境的文件夹中新建 .python-version 文件,并写入虚拟环境的名字
  3. 以后进入该的文件夹就会自动激活虚拟环境,离开该文件夹就会退出虚拟环境。

手动激活

  • pyenv activate name 激活虚拟环境。
  • pyenv deactivate 退出虚拟环境

删除虚拟环境

  1. 删除 $(pyenv root)/versions$(pyenv root)/versions/{version}/envs 的相关文件夹即可
  2. 命令行运行 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

Ref

  1. pyenv 及 pyenv-virtualenv 安装
  2. virtualenv
  3. Linux 下多版本 python 共存
  4. Python 版本控制神器
  5. Python 版本管理