[学习笔记]Pyenv初体验

Python环境控制的方式很多,如常用的虚拟环境实现的手段Virtualenv,配合workon使用十分方便。但无法便捷的控制Python版本。 今天我们便学习利用PyenvPyenv-virtualenv 来控制python版本与虚拟环境。

Pyenv

我们用Pyenv托管Python的版本

pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.

安装Pyenv

这里讨论的是类unix操作系统下,windows用户可以在wsl下安装(推荐),或者参考使用pyenv-win

  1. 将pyenv clone 到本地

    $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    

  2. 配置环境变量

    bash用户:

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
    $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
    

    zsh用户:

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
    $ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
    

  3. 建议构建的依赖环境

    可以不安装,但是使用中有可能会遇到一些奇怪的问题

    https://github.com/pyenv/pyenv/wiki

    • Mac OS X:

      $ brew install openssl readline sqlite3 xz zlib

    • Ubuntu/Debian/Mint:

       
      $ sudo apt-get update; sudo apt-get install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
      

    • CentOS/Fedora 21 and below:

      $ sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel

  4. 重新启动终端

    $ exec "$SHELL"

至此Pyenv已经安装完毕

使用Pyenv

  • 查看可以安装的python版本

    $ pyenv install --list

  • 安装python版本到本地

    $ pyenv install 3.7.0

  • 查看已经托管的python版本

    $ pyenv versions

  • 删除某个托管的版本

    $ pyenv uninstall 3.7.0

pyenv-virtualenv

我们利用pyenv-virtualenv 配合pyenv管理 已经通过pyenv托管的python版本 的虚拟环境

(其实pyenv创建的python版本和pyenv-virtualenv都是一个虚拟环境, 而pyenv-virtulalenv是作为一个插件协助pyenv管理)

pyenv-virtualenv is a pyenv plugin that provides features to manage virtualenvs and conda environments for Python on UNIX-like systems.

安装pyenv-virtualenv

  1. clone pyenv-virtualenv 到本地

    $ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

  2. 配置环境变量

    • bash 用户

      $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

    • zsh 用户

      $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

  3. 重新启动终端

    $ exec "$SHELL"

至此pyenv-virtualenv安装完毕

使用pyenv-virtualenv

pyenv-virtualenv 作为一个pyenv 的内部插件与 virtualenv 的使用略有不同,但是原理思路都是一样的。

  • 创建虚拟环境

    (使用的python版本必须已经托管在pyenv下)

    $ pyenv virtualenv 3.7.0 py37

  • 激活虚拟环境

    $ pyenv activate py37
    这时候会有一条提醒:
    pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
    在使用虚拟环境的时候,shell前方有一个(py37) 的提醒标志。如果按照它给出的操作便可以去掉提醒标志,个人觉得没有必要

  • 退出虚拟环境

    $ pyenv deactivate

  • 进入文件夹自动加载环境

    $ pyenv local py37
    运行该命令后会在当前文件夹创建一个.python-version文件, 当用户进入存在该文件的目录后便会自动激活py37虚拟环境

  • 卸载虚拟环境

    $ pyenv uninstall my-virtual-env
    $ pyenv virtualenv-delete my-virtual-env

嗯,有了pyenv便可以放心大胆的去构建不同的python环境。而不会更改mac的系统python了。至尊循环走起!