在修改 quickbox-lite 的过程中,我发现部分的软件需要依赖不同的 Python 版本,如果直接修改系统默认的 Python 则可能引起各种奇怪的问题,因此 pyenv 就是一个很不错的选择了。
pyenv 本身是一个 Python 的版本管理工具,它可以直接改变全局的 Python 版本,也可以结合 virtual python environments 使用。在这里我主要使用的就是它的 virtual python environments 管理功能。
Contents
安装 pyenv
由于 pyenv 通过编译的方式安装新的 Python 版本,因此在手动或者自动安装之前,最好先解决 Python 的编译依赖,这些依赖在官方文档中有描述。以 Debian 系为例,直接运行如下命令安装好基本依赖即可:
sudo apt-get install -y 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 python-openssl git
pyenv 实际上是由如下几个部分构成:
- pyenv: pyenv 主程序
- pyenv-virtualenv: pyenv 的插件。用于管理 vierual environments
- pyenv-update: 用来更新 pyenv 及其插件
- pyenv-doctor: 验证 pyenv 及其插件的安装
- pyenv-which-ext: 用来寻找相同命令的插件
因此,手动安装也就是使用 git 工具拉取最新的工具。如果使用自动脚本,则只需要简单的一行:
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
这个脚本默认的安装位置是 ~/.pyenv,如果想要改变默认的安装位置,最简单的办法是赋予 PYENV_ROOT 环境变量。
PYENV_ROOT=/opt/pyenv bash <(wget -qO- https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer -o /dev/null)
在安装完成后,仍然需要手动写入环境变量,例如:
cat >> /root/.bashrc <<EOF export PYENV_ROOT="/opt/pyenv" export PATH="/opt/pyenv/bin:\$PATH" eval "\$(pyenv init -)" eval "\$(pyenv virtualenv-init -)" EOF
需要注意的是,此时需要重载 shell 配置文件才能使环境变量生效:
source ~/.bashrc
使用 pyenv-virtualenv
我安装 pyenv 的主要目的就是使用 pyenv 配合 virtualenv 进行 Python 软件的环境隔离。
- 安装特定的 Python 版本(这需要一定时间的编译,编译时间由系统资源决定):
pyenv install 2.7.18
- 检查已安装的版本:
pyenv versions
- 列出可安装的版本:
pyenv install -l
在安装好目标环境以后,我们就可以很简单的通过 pyenv 的 virtualenv 插件直接创建一个虚拟环境。
pyenv virtualenv 2.7.18 demo
该环境存在于 $PYENV_ROOT/versions 目录中。
- 列出虚拟环境
pyenv virtualenvs
- 激活虚拟环境
pyenv activate demo
- 退出虚拟环境
pyenv deactivate
- 删除虚拟环境
pyenv uninstall demo
当然,由于 pyenv virtualenv 实际上是 virtualenv 的 wrapper,因此我们也可以手动创建自定义的虚拟环境目录:
$PYENV_ROOT/versions/${version}/bin/python${major_version} -m virtualenv $path
其中 ${version} 是具体的 Python 版本号,${major_version} 是 Python 的大版本(2或者3), $path 则是目标目录。值得注意的是,如果需要使用 Python2 的 virtualenv 还需要额外安装
$PYENV_ROOT/versions/${version}/bin/python2 -m pip install virtualenv
利用上述的这些方式我们就可以集中管理 Python 的版本,并且创建相应的虚拟环境以方便各种软件的安装。在 quickbox-lite 的 1.3.5 版本以后, FlexGet 以及 autoremovetorrents 都是以这种方式提供的。
总结
上述的功能其实只是 pyenv 的一个简单的功能,由于它存在 shims (垫片)路径(见官方文档),因此可以劫持系统级的 Python 环境,你甚至可以为特定的软件设置特定的 .python-version配置,这样即便是系统级别的软件,也可以使用不同的 Python 环境运行。
参考
https://github.com/pyenv/pyenv
http://einverne.github.io/post/2017/04/pyenv.html
https://www.jianshu.com/p/c47c225e4bb5