Python 2.x 与 Python 3.x 之间的路就是我至今走过最长的套路。距离 Python 3.0 发布过去 8 年时间(2008.10.3)依然有很多人坚守在 Python 2.7 上面。
我想起在 2015 参加 PyCon China 的时候, Guido 的致词的末尾还不忘呼吁大家紧急上 3.x。这对于一个拥有庞大用户数的语言来说,难免尴尬。
随着 Python 3.6 的发布,Django Foundation 也开始了停止支持 Python 2.7 的 工作 。连 Django 都开始赶鸭子上 3.x 的车,老司机们也开始准备上车,在此过程中难免在 2.x <—> 3.x 之间相互转换,修改系统 shell 的 PATH 未免太过繁杂, pyenv 来帮你解决这个问题。
pyenv 支持 Unix 基本上可以覆盖主流的开发环境,从实现原理来说,是 pyenv 封装了一堆 shell 脚本,来帮助我们切换 shell path 从而使得 Python 的版本切换带来的心智负担降到最低。
本文仅描述 macOS 下的使用
安装
通过 Brew 进行安装。
$ brew update
$ brew install pyenv
# 如果已经安装,更新到最新版可使用
$ brew upgrade pyenv
使用
本文描述 fish shell 下面的使用。
配置
pyenv 在使用的时候需要劫持当前用户的 PATH,以保证优先查找 pyenv 规定的路径。所以在所有 shell 启动时都运行修改 $PATH 的操作。
由于 fish shell 有自己的一套语法系统,pyenv 也专门做了适配。修改fish 的 config 并加入以下代码,即可完成 pyenv 的配置工作。
其中还附带命令行补全哦
setenv PATH '/Users/john/.pyenv/shims' $PATH
setenv PYENV_SHELL fish
. '/usr/local/Cellar/pyenv/1.0.7/libexec/../completions/pyenv.fish'
command pyenv rehash 2>/dev/null
function pyenv
set command $argv[1]
set -e argv[1]
switch "$command"
case rehash shell
. (pyenv "sh-$command" $argv|psub)
case '*'
command pyenv "$command" $argv
end
end
配置完成后,启动一个新的 shell panel。
$ echo $PATH
/Users/john/.pyenv/shims /usr/local/bin /usr/bin /bin /usr/sbin /sbin
其中包含 .pyenv/shims 即配置完成。
安装不同的 Python
查看可使用的 Python 版本
$ pyenv install -l
安装需要的 Python 版本
$ pyenv install 3.6.0
指定 Python 版本
pyenv 提供 local/global 两个命令来进行 Python 指定。但 local/global 之前有什么区别呢?
local 意在提供更加细致的 Python 版本指定,这极大地方便了多个不同 Python 版本之间项目的使用。local 的节点是通过目录来控制,也即是同个 shell 下的不同目录是可以不使用同一个 Python 版本控制。
global 则会将当前系统的 Python 版本进行刷新,运行一次后,效果持久。无论你重开 shell 还是重启,Python 还是你最近使用 global 指定的版本。