本文在我的网站持续更新,查看最新版本请访问https://www.itshutong.com/articles/336/crazy-about-python-version-try-pyenv
python虽好,版本让人烦恼
人生苦短,我用python...
python语法的简洁优雅,模块的丰富,让有开发经验的人很容易上手,开发效率很高。然而python2和python3的诸多不兼容让人甚为烦恼。虽然python3已经推出多年,可生产环境还在运行着很多python2代码。经常需要在两个大版本之间切换。切换时遇到各种莫名其妙的问题,如pip升级后,默认就是安装在python3,python2的pip不起作用了。安装第三方类库时也时常被python的版本弄晕了。
这种版本混乱管理的问题,如果得不到解决,那么用python只会让人生更加苦短...
好在,有pyenv, 一切都变得美好起来
什么是pyenv
简单的说,pyenv是管理python版本的工具。安装pyenv后,可以管理各种python版本,并且各个版本的环境完全独立,互不干扰
安装pyenv
pyenv的github地址
- 下载pyenv的代码到~/.pyenv目录下
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
- 添加环境变量
如果你用的是bash, 将以下环境变量添加到 ~/.bash_profile, 我用的是zsh,添加到的是 ~/.zshrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
- 启动shell时,自动初始化pyenv
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
- 重新加载配置文件
source ~/.zshrc
安装依赖
pyenv将尽力下载和编译所需的Python版本,但由于未满足的系统依赖关系,编译失败,或者编译成功,但新的Python版本在运行时显示出奇怪的错误。以下说明是我们针对正确构建环境的建议。
yum -y install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel
查看版本
whereis pyenv
pyenv: /root/.pyenv/bin/pyenv
pyenv --version
pyenv 1.1.5-42-g435e362
pyenv的使用
查看当前使用的python版本
pyenv version
system (set by /root/.pyenv/version) # system表示系统安装的版本
查看可安装的版本列表
pyenv install --list
Available versions:
2.1.3
2.2.3
2.3.7
2.4
...
安装其他版本(以3.6.2为例)
pyenv install 3.6.2 # 安装版本(很慢,默认的源很卡)
# 默认的安装源很卡,建议用以下方式安装:
v=3.6.2|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v # 用国内源安装很快
查看已安装的版本
pyenv versions
* system (set by /root/.pyenv/version)
3.6.2
将3.6.2作为当前使用版本
pyenv global 3.6.2 # 全局设置版本
# pyenv local 3.6.2 # 局部设置版本,当前目录生效
pyenv versions
system
* 3.6.2 (set by /root/.pyenv/version)
卸载版本
pyenv uninstall 3.6.2
查看所有pyenv的指令
pyenv commands
virtualenv
为了pyenv,已经可以很方便地切换不同版本。但对于有代码洁癖的程序员来说,如果有不同的项目,每个项目都有不同的扩展类库,这些类库都统一安装在相应版本的python环境,会让他们感到很不舒服。他们更希望每个项目的环境都是独立的,纯粹的,干净的。
这么挑剔的要求,virtualenv表示实现起来毫无压力...
virtualenv就是python的虚拟化环境,用于管理python包,让系统环境干净
安装pyenv-virtualenv
- 下载代码
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
- 配置自动激活
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
- 重新启动shell
source ~/.zshrc
pyenv-virtualenv的使用
创建3.6.2版本的虚拟环境
pyenv virtualenv 3.6.2 py3.6.2
pyenv versions
system
* 3.6.2 (set by /root/.pyenv/version)
3.6.2/envs/py3.6.2
py3.6.2
使3.6.2版本的虚拟环境生效
pyenv activate py3.6.2
退出虚拟环境
pyenv deactivate
删除虚拟环境,简单粗暴地将整个目录干掉即可
rm -rf ~/.pyenv/versions/py3.6.2
总结
pyenv用来管理python自身的版本,virtualenv用来管理某个python环境下的包
有了pyenv,妈妈再也不用担心我被python版本弄晕了