转自使用 pyenv 管理 Python 版本 ,略有修改。
前言
在使用python的时候,我们经常被python项目混乱的版本以及复杂的包依赖搞得头晕脑胀,但是自从有了pyenv和anaconda(python包虚拟环境,包依赖),一切都清晰明了了。
pyenv 是 Python 版本管理工具。 pyenv 可以改变全局的 Python 版本,安装多个版本的 Python, 设置目录级别的 Python 版本,还能创建和管理 virtual python environments 。所有的设置都是用户级别的操作,不需要 sudo 命令。
pyenv 主要用来管理 Python 的版本,比如一个项目需要 Python 2.x ,一个项目需要 Python 3.x 。 而 anaconda 主要用来管理 Python 包的依赖,不同项目需要依赖的包版本不同,则需要使用虚拟环境。
pyenv 通过系统修改环境变量来实现 Python 不同版本的切换。而 anaconda 通过将 Python 包安装到一个目录来作为Python 包虚拟环境,通过切换目录来实现不同包环境间的切换。
pyenv 的美好之处在于,它并没有使用将不同的 PATH 植入不同的Shell这种高耦合的工作方式,而是简单的在 PATH 的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而使后方的系统路径失效。
pyenv安装
具体的安装方式参照 官网
centos自动安装
1
2# curl https://pyenv.run | bash
# exec $SHELL # Restart your shell so the path changes take effectcentos手动下载安装
在服务器环境中,发现使用上一种方式经常不好使,网络无法链接,所以采用以下这种方式,1
2
3
4
5
6$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$exec "$SHELL"
我这里是Mac,推荐使用brew安装。
安装成功之后,在.bashrc 或者 .bash_profile 中添加三行来开启自动补全.1
2
3export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
pyenv 常用命令
使用 pyenv commands 显示所有可用命令
查看本机安装 Python 版本
1
pyenv versions
查看可安装 Python 版本
1
pyenv install -l
python 安装与卸载
1
2$ pyenv install 2.7.3 # 安装python
$ pyenv uninstall 2.7.3 # 卸载pythonpython切换
1
2$ pyenv global 2.7.3 # 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
$ pyenv local 2.7.3 # 设置 Python 本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。
python优先级
shell > local > global
pyenv 会从当前目录开始向上逐级查找 .python-version 文件,直到根目录为止。若找不到,就用 global 版本。1
2
3
4$ pyenv shell 2.7.3 # 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。–unset 参数可以用于取消当前 shell 设定的版本。
$ pyenv shell --unset
$ pyenv rehash # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)