使用 pyenv 配合 virtualenv 安装和管理多个 Python 版本

在工作开发中,一直使用 virtualenv 来管理 python 的包环境。很好的解决了不同项目使用不同python包的需求。对于多 python 版本的问题如何解决一直无解,虽然可以安装多个

版本的 python,靠绝对路径或靠创建虚拟环境的时候指定 python(virtualenv -p)版本来解决,但总感觉不是那么的优雅。同事推荐了 pyenv ,一直没用过,特从网上找了些资料试着配置了下,记录如下。

pyenv 是一个 Python 版本的管理工具,可以通过它随时安装和切换 2.x 和 3.x 版本,非常好用。

pyenv vs virtualenv

pyenv 是针对 python 版本的管理,通过修改环境变量的方式实现;

virtualenv 是针对python的包的多版本管理,通过将python包安装到一个模块来作为python的包虚拟环境,通过切换目录来实现不同包环境间的切换。

pyenv 原理

pyenv 的美好之处在于,它并没有使用将不同的 PATH 植入不同的 shell 这种高耦合的工作方式,而是简单地在 PATH 的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而架空了后面的系统路径。

pyenv 安装使用

自动安装

pyenv 提供了自动安装的工具,执行命令安装即可:

curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

需保证系统有 git ,否则需要新安装 git 工具。

手动安装

将 pyenv 检出到你想安装的目录。建议路径为:$HOME/.pyenv

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

添加环境变量。PYENV_ROOT 指向 pyenv 检出的根目录,并向 PATH 添加 PYENV_ROOT/bin 以提供访问 pyenv 这条命令的路径:

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

这里的 shell 配置文件(~/.bash_profile)依不同 Linux 而需作修改——Zsh:~/.zshenv;Ubuntu:~/.bashrc

向 shell 添加 pyenv init 以启用 shims 和命令补完功能:

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

配置文件的位置同上一条一样需要修改。重启 shell(因为修改了 $PATH)。

$ exec $SHELL

pyenv 常用命令

# 查看版本
pyenv versions
  system
  2.7.15
* 3.6.7 (set by PYENV_VERSION environment variable)

# pyenv 常用的命令说明

使用方式: pyenv <命令> [<参数>]

命令:
   commands    查看所有命令
   local       设置或显示本地的Python版本
   global      设置或显示全局Python版本
   shell       设置或显示shell指定的Python版本
   install     安装指定Python版本
   uninstall   卸载指定Python版本)
   version     显示当前的Python版本及其本地路径
   versions    查看所有已经安装的版本
   which       显示安装路径

pyenv
pyenv 1.2.8
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

python 配置

  • pyenv versions -- 查看系统当前安装的python列表
  • pyenv install --list -- 查看可安装的版本
  • pyenv install -v 3.5.1 -- 安装python
  • pyenv uninstall 2.7.3 -- 卸载python
  • pyenv rehash -- 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

python 切换

  • pyenv global 3.4.0 -- 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
  • pyenv local 2.7.3 -- 设置面向程序的本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。
    pyenv 会从当前目录开始向上逐级查找 .python-version 文件,直到根目录为止。若找不到,就用 global 版本。
  • pyenv shell pypy-2.2.1 -- 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。--unset 参数可以用于取消当前 shell 设定的版本。
  • pyenv shell --unset

python 优先级

shell > local > global

pyenv 插件: pyenv-virtualenv

安装

使用自动安装 pyenv 后,它会自动安装部分插件,通过 pyenv-virtualenv 插件可以很好的和 virtualenv 结合:

[root@linux3311 ~]# cd .pyenv/plugins/
[root@linux3311 plugins]# ll
insgesamt 24
drwxr-xr-x. 4 root root 4096 19. Jun 05:17 pyenv-doctor
drwxr-xr-x. 5 root root 4096 19. Jun 05:18 pyenv-installer
drwxr-xr-x. 4 root root 4096 19. Jun 05:18 pyenv-update
drwxr-xr-x. 7 root root 4096 19. Jun 05:18 pyenv-virtualenv
drwxr-xr-x. 4 root root 4096 19. Jun 05:18 pyenv-which-ext
drwxr-xr-x. 5 root root 4096 19. Jun 05:17 python-build

使用

  • 创建虚拟环境 $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
    若不指定python 版本,会汇报认使用当前环境python版本。
  • 列出当前虚拟环境 pyenv virtualenvs
  • 激活虚拟环境 pyenv activate
  • 退出虚拟环境 pyenv deactivate
  • 删除虚拟环境 pyenv uninstall my-virtual-env

使用 pyenv 来管理 python,使用 pyenv-virtualenv 插件来管理多版本 python 包。

此时,还需注意,当我们将项目运行的 env 环境部署到生产环境时,由于我们的python 包是依赖python 的,需要注意生产环境的python版本问题(详见 这里)。

Mac 下 pyenv 的安装及使用

安装 Homebrew

首先安装 Homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew -v
Homebrew 1.8.5
Homebrew/homebrew-core (git revision 497ca; last commit 2018-12-16)
Homebrew/homebrew-cask (git revision 8be7c; last commit 2018-12-17)

安装 pyenv

brew install pyenv

pyenv.png

配置脚本文件

.zshrc 最后写入:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

if which pyenv > /dev/null;
  then eval "$(pyenv init -)";
fi

没安装 oh-my-zsh 的话写入 ~/.bash_profile

之后生效配置:

source ~/.zshrc

Mac 中安装 PySpider

在 PySpider 支持 Python3.7 之前只能暂时降级 Python。

# 使用pyenv切换python版本
brew install pyenv
pyenv install 3.6.7
pyenv shell 3.6.7

# 创建PySpider虚拟环境
mkdir pyspider
cd pyspider
python -m venv venv
source venv/bin/active
pip install pyspider

# 安装期间出现 SSL 或 pycurl 错误
__main__.ConfigurationError: Curl is configured to use SSL, but we have not been able to determine which SSL backend it is using. Please see PycURL documentation for how to specify the SSL backend manually.

# 解决方法
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
export LDFLAGS=-L/usr/local/opt/openssl/lib;export CPPFLAGS=-I/usr/local/opt/openssl/include;pip install pycurl --compile --no-cache-dir

# 重新安装并运行pyspider
pip install pyspider

pyspider
[W 181217 15:23:35 run:413] phantomjs not found, continue running without it.
[I 181217 15:23:37 result_worker:49] result_worker starting...
[I 181217 15:23:37 processor:211] processor starting...
[I 181217 15:23:37 tornado_fetcher:638] fetcher starting...
[I 181217 15:23:37 scheduler:647] scheduler starting...
[I 181217 15:23:37 scheduler:782] scheduler.xmlrpc listening on 127.0.0.1:23333
[I 181217 15:23:37 scheduler:586] in 5m: new:0,success:0,retry:0,failed:0
[I 181217 15:23:37 app:76] webui running on 0.0.0.0:5000

加速

  1. pyenv 搜狐镜像源加速:http://mirrors.sohu.com/python/
  2. 下载需要的版本放到 ~/.pyenv/cache 文件夹下面
  3. 然后执行 pyenv install 版本号 安装对应的 python 版本
  4. 傻瓜式脚本如下,其中 v 表示要下载的版本号
    v=3.6.5;wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v  
    

pyenv 结合 virtualenv 创建虚拟环境

pyenv virtualenv 3.4.3 TEST
pyenv activate TEST
pyenv deactivate
pyenv uninstall TEST

参考

  1. pyenv 下载地址:https://github.com/pyenv/pyenv
  2. virtualenv 中文文档地址:https://virtualenv-chinese-docs.readthedocs.io/en/latest/
如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论