pyenv安装使用指南

pyenv安装使用指南

evobot 802 2018-05-08

在使用python的过程中,经常会遇到不同的项目可能使用的是不同的python版本,或者有些项目需要使用特定版本的软件包,为了保持系统python软件包不会变的混乱,我们可以使用pyenv来管理系统的python版本,并且使用virtualenv来管理不同的环境。


pyenv安装配置

  • 官方的仓库和安装步骤可以查看github-pyenv,为了避免安装时报错,首先在shell中声明全局变量:

    $ export PYTHON_CONFIGURE_OPTS="--enable-shared"	
    

克隆仓库

  • 克隆最新版本的pyenv仓库,这里克隆到家目录下,也可以自行指定克隆到其他目录:

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

配置pyenv

  1. 为pyenv添加环境变量,如果先前克隆仓库时指定了其他目录,这里也要相应的更改pyenv的目录:

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    

    使用zsh的需要将上面的~/.bash_profile替换为~/.zshenv

    Ubuntu和Fedora则使用~/.bashrc替换;

  2. 然后将pyenv的初始化命令添加到shell中:

    $ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
    

    使用zsh的需要将上面的~/.bash_profile替换为~/.zshenv

    Ubuntu和Fedora则使用~/.bashrc替换;

  3. 安装完成后,需要重新登陆shell或者重新载入配置文件,如果上面替换过.bash_profile文件,则下面的命令也要更改为替换的文件名:

    $ source ~/.bash_pofile
    
  4. 执行命令pyenv --versionpyenv --help来验证pyenv安装是否正确:

    $ pyenv --version
    pyenv 1.2.4
    $ pyenv --help
    Usage: pyenv <command> [<args>]
    
    Some useful pyenv commands are:
       commands    List all available pyenv commands
       local       Set or show the local application-specific Python version
       global      Set or show the global Python version
       shell       Set or show the shell-specific Python version
       install     Install a Python version using python-build
       uninstall   Uninstall a specific Python version
       rehash      Rehash pyenv shims (run this after installing executables)
       version     Show the current Python version and its origin
       versions    List all Python versions available to pyenv
       which       Display the full path to an executable
       whence      List all Python versions that contain the given executable
    
    See `pyenv help <command>' for information on a specific command.
    For full documentation, see: https://github.com/pyenv/pyenv#readme
    

更换国内源

  • 由于使用pyenv默认会到官网下载python版本,导致下载速率非常缓慢,所以可以使用国内的源来加速pyenv的版本安装速度,pyenv的python版本下载配置文件每个都是单独的,所以需要针对要下载的版本修改其配置文件;

  • pyenv的python版本配置文件在目录~/.pyenv/plugins/python-build/share/python-build/下,例如需要下载python3.6.0版本,这里替换为搜狐的源http://mirrors.sohu.com/python/

  • 修改3.6.0文件如下:

    #require_gcc
    install_package "openssl-1.0.2k" "https://www.openssl.org/source/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl
    install_package "readline-6.3" "https://ftpmirror.gnu.org/readline/readline-6.3.tar.gz#56ba6071b9462f980c5a72ab0023893b65ba6debb4eeb475d7a563dc65cafd43" standard --if has_broken_mac_readline
    if has_tar_xz_support; then
      #install_package "Python-3.6.0" "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz#b0c5f904f685e32d9232f7bdcbece9819a892929063b6e385414ad2dd6a23622" ldflags_dirs standard verify_py36 ensurepip
      # 注释原下载地址,增加下面的搜狐源下载地址
      install_package "Python-3.6.0" "http://mirrors.sohu.com/python/3.6.0/Python-3.6.0.tar.xz" ldflags_dirs standard verify_py36 ensurepip
    else
      #install_package "Python-3.6.0" "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz#aa472515800d25a3739833f76ca3735d9f4b2fe77c3cb21f69275e0cce30cb2b" ldflags_dirs standard verify_py36 ensurepip
      # 同样进行替换
      install_package "Python-3.6.0" "http://mirrors.sohu.com/python/3.6.0/Python-3.6.0.tgz" ldflags_dirs standard verify_py36 ensurepip
    fi
    
  • 修改完成后,执行pyenv install 3.6.0就可以看到下载是从搜狐的源进行下载,下载完成的python包保存在~/.pyenv/cache下:

    $ pyenv install 3.6.0
    Downloading Python-3.6.0.tar.xz...
    -> http://mirrors.sohu.com/python/3.6.0/Python-3.6.0.tar.xz
    Installing Python-3.6.0...
    Installed Python-3.6.0 to /home/evobot/.pyenv/versions/3.6.0
    
  • 正是因为下载的包在~/.pyenv/cache目录下,所以我们也可以使用另一种方法来加速下载python版本包,直接到搜狐源下载需要的版本,然后放入~/.pyenv/cache目录,再执行pyenv install安装即可,也可以使用下面的一建执行命令:

    v=3.5.2|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
    

    其中变量v对应要下载的python版本号。

pyenv使用

  • 想要查看pyenv支持哪些python版本,可以执行pyenv install --list命令查看:

    $ pyenv install --list
    Available versions:
      2.1.3
      2.2.3
      2.3.7
      ...
    
  • 安装所需python版本命令如下,其中-v选项表示安装时是否输出详细信息:

    $ pyenv install -v 3.6.0
    $ pyenv install 3.6.0
    
  • pyenv versions查看当前系统已安装的python版本,其中有*的表示当前生效的版本,而pyenv version则是查看当前生效的python版本:

    $ pyenv versions
    * system (set by /root/.pyenv/version)
      3.5.0
    $ pyenv version
    3.5.0 (set by /root/.pyenv/version)
    
  • 卸载python版本命令如下:

    $ pyenv versions
    * system (set by /root/.pyenv/version)
      3.5.0
    
    $ pyenv uninstall 3.5.0
    pyenv: remove /root/.pyenv/versions/3.5.0? y
    
    $ pyenv versions
    * system (set by /root/.pyenv/version)
    
  • 初始pyenv versions只有system,即系统全局的python版本,pyenv可以针对系统全局、目录、shell分别设置不同的python版本:

    # 设置全局python版本,版本号将会写入~/.pyenv/version
    $ pyenv global 3.5.0
    
    # 为当前目录设置python版本,版本号写入当前目录的.python-version文件。
    # local设置的python版本优先级比global高。
    $ pyenv local 3.6.0
    $ pyenv versions
      system
      3.5.0
    * 3.6.0 (set by /root/code/.python-version)
    
    # 设置当前shell的python版本是通过设置PYENV_VERSION环境变量改变的。
    # shell设置的pthon版本优先级比global和local都要高。
    $ pyenv shell 3.5.0
    $ pyenv versions
      system
    * 3.5.0 (set by PYENV_VERSION environment variable)
      3.6.0
    
     # 取消当前shell的python版本设置
     $ pyenv shell --unset
    
  • 在每次增删python版本或者pip安装了新的包后,都需要执行pyenv rehash更新shims。

更多的pyenv命令,可以查看官方文档

virtualenv插件

pyenv的virtualenv插件,能够实现与virtualenv相同的功能,使用pyenv管理系统python版本,使用virtualenv管理不同的python环境,从而实现不同的项目在相同的python版本时,也能够同时使用各自的python环境。

安装

  • pyenv-virtualenv插件安装直接使用git克隆到pyenv的Plugins目录:

    $ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
    
  • 添加命令到~/.bash_profile,zsh用户添加到~/.zshenv,Ubuntu用户添加到~/.bashrc,完成后更新shell或重新登陆生效:

    $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
    $ exec "$SHELL"
    

使用

  • pyenv-virtualenv可以为同一个python版本创建多个虚拟工作环境,命令为pyenv virtualenv [python版本号] [虚拟环境名],为当前的python版本创建虚拟环境的命令为pyenv virtualenv [虚拟环境名]

    $ pyenv virtualenv 3.5.0 my-virtual-env-3.5.0
    
    $ pyenv version
    3.4.3 (set by /home/yyuu/.pyenv/version)
    $ pyenv virtualenv venv34
    
  • 使用pyenv virtualenvs查看系统当前存在的虚拟环境:

    $ pyenv virtualenvs
      3.5.0/envs/venv35 (created from /root/.pyenv/versions/3.5.0)
      venv35 (created from /root/.pyenv/versions/3.5.0)
    
  • 如果在目录中使用pyenv local [虚拟环境名]为目录设置工作环境,那么在进入和离开目录时,会自动激活和去激活工作环境,并且在进入目录时,会在命令行开头显示当前的工作环境:

    root@ubuntu:~/code# pyenv local venv35
    (venv35) root@ubuntu:~/code#
    
  • 如果没有使用pyenv local命令为目录设置工作环境的话,也可以使用pyenv activate [虚拟环境名]来临时激活一个全局的工作环境,去激活使用pyenv deactivate命令:

    root@ubuntu:~/code2# pyenv activate venv35
    pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
    (venv35) root@ubuntu:~/code2# cd ..
    (venv35) root@ubuntu:~#
    
    (venv35) root@ubuntu:~# pyenv deactivate
    root@ubuntu:~#
    
  • 删除已有的虚拟环境使用pyenv uninstall my-virtual-env命令:

    # pyenv uninstall venv35
    pyenv-virtualenv: remove /root/.pyenv/versions/3.5.0/envs/venv35? y
    

pip更换源

  • pip安装python包经常也会非常缓慢,可以将其更换为国内源,在家目录下创建.pip目录,并创建.pip/pip.conf文件,文件内容如下:

    [global]
    index-url = http://mirrors.aliyun.com/pypi/simple/
    [install]
    trusted-host=mirrors.aliyun.com
    
  • 这里使用阿里的pip镜像,使用pip install可以看到已经变成从阿里的镜像下载python包:

    $ pip install plumbum
    Collecting plumbum
      Downloading http://mirrors.aliyun.com/pypi/packages/b2/05/7720109462d0bd60466e74076a38ca12068771da146bfd18a502726c9da8/plumbum-1.6.6-py2.py3-none-any.whl (111kB)
        100% |████████████████████████████████| 112kB 1.2MB/s
    Installing collected packages: plumbum
    Successfully installed plumbum-1.6.6
    


# Linux # Python