使用 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
-- 安装pythonpyenv uninstall 2.7.3
-- 卸载pythonpyenv 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
配置脚本文件
在 .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
加速
- pyenv 搜狐镜像源加速:http://mirrors.sohu.com/python/
- 下载需要的版本放到
~/.pyenv/cache
文件夹下面 - 然后执行
pyenv install 版本号
安装对应的 python 版本 - 傻瓜式脚本如下,其中 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
参考
- pyenv 下载地址:https://github.com/pyenv/pyenv
- virtualenv 中文文档地址:https://virtualenv-chinese-docs.readthedocs.io/en/latest/