Pyenv 简介

在使用 python 进行编程时, 经常遇到多个编程环境共存问题. pyenv 可以很好的解决这个问题, 本教程根据是学习使用 pyenv 的记录.

安装

1
2
yaourt pyenv
yaourt pyenv-virtualenv

archlinux 系统安装上面命令直接安装, 其他版本可也从源中或者源代码安装.

安装完成后,pyenv 命令还没有加进系统的环境变量,需要将如下内容加到 ~/.zshrc 中,然后执行 source ~/.zshrc

1
2
3
4
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Pyenv 基本操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pyenv versions

* system (set by /home/lengyue/.python-version)
2.7.13
3.5.2
# 查看目前所有版本的 python

pyenv version
# 查看当前版本的 python

pyenv global system/3.5.2
# 设置全局的 python 环境

pyenv local system/3.5.2
# 设置局部的 python 环境, local 优先级高于 global

pyenv local --unset
# 重置 local 环境

pyenv shell system/3.5.2
# 设置 shell 的 python 环境, shell 环境又有限于 local

pyenv shell --unset
# 重置 shell python 环境

安装不同版本 python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
pyenv install --list
# pyenv 支持的所有 python 列表

pyenv install 3.5.2
# 安装特定版本的 python

pyenv uninstall 3.5.2
# 卸载特定版本的 python

pyenv rehash
# refresh database

安装特定版本 python 出现错误:

1
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib

按照下帖解决, 用如下命令

1
2
3
CFLAGS=-I/usr/include/openssl-1.0 \
LDFLAGS=-L/usr/lib64/openssl-1.0 \
pyenv install 3.5.2

Pyenv-virtualenv python 不同项目虚拟环境的搭建

利用 pyenv-virtualenv 就可以管理多个依赖库环境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
pyenv virtualenv PYTHON_VERSION PROJECT_NAME
# 创建新的环境,位于 ~/.pyenv/versions/, 其中,PYTHON_VERSION 是具体的 Python 版本号,
# 例如,3.6.0,PROJECT_NAME 是我们自定义的项目名称。比较好的实践方式是,
# 在 PROJECT_NAME 也带上 Python 的版本号,以便于识别。现假设我们有 XDiff 这么一个项目,
# 想针对 Python 2.7.13 和 Python 3.6.0 分别创建一个虚拟环境,那就可以依次执行如下命令。

pyenv virtualenv 3.6.0 py36_XDiff
pyenv virtualenv 2.7.13 py27_XDiff

pyenv virtualenvs
# 创建完成后,通过执行 pyenv virtualenvs 命令,就可以看到本地所有的项目环境

pyenv activate py36_XDiff
# 切换到新的环境

pyenv deactivate
# 退回到系统环境

pyenv uninstall py36_XDiff
# Removing the directories in $(pyenv root)/versions and
# $(pyenv root)/versions/{version}/envs will delete the virtualenv
# uninstall 的命令不能完全卸载完, 可以使用删除的方式

项目实践举例

假设现在有一个项目同时尝试 python 3.5.2 和 3.3.2 进行编写, 流程如下.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
cd ./Downloads
# 进入目录

mkdir Mao & cd Mao
# 创建项目目录并进入

# 接下来有两种方法, 一种用 local 变量, 另一种用 virtualenv 方式

# local 变量法

pyenv local 3.5.2 & pip install package
# 进入 3.5.2 的环境, 并安装必要的软件包, 进行测试

pyenv local 3.3.2 & pip install package
# 进入 3.3.2 的环境, 并安装必要的软件包, 进行测试

# virtualenv 法

pyenv virtualenv 3.6.0 py36_Mao
pyenv virtualenv 2.7.13 py33_Mao
# 创建两个虚拟环境

pyenv activate py35_Mao
# 进入 3.5 环境进行工作

pyenv activate py33_Mao
pyenv deactivate
# 进入 3.3 环境进行工作, 结束后离开虚拟环境

rm -rf ~/.pyenv/versions/py35_Mao/
rm -rf ~/.pyenv/versions/3.5.2/envs/py35_Mao
rm -rf ~/.pyenv/versions/py33_Mao/
rm -rf ~/.pyenv/versions/3.3.2/envs/py33_Mao
# 如果以后不再使用虚拟开发环境, 删除环境

参考资料