用 pyenv 管理 Python 版本

缘起

笔者曾提到,Python 用 venv 创建虚拟环境。的确,Python 中采用 venv 来管理虚拟环境是一个很棒的局部安装方案,类似 npm 的 node_modules 目录。但是该方案还尚且不能解决 Python 版本切换的问题,幸运的是,pyenv 这个工具可以完美解决,类似 npm 中的 n,它可以使用简单的命令切换多个 Python 版本。

本文将以 Ubuntu 22.04 为例来介绍它的安装方法,虽然它原生并不支持 Windows,但是有人为 Windows 做了移植,见 pyenv-win

值得注意的是,这个项目有趣的地方在于,无论是安装还是使用,都是以用户权限都能完成的,非常适合当今多用户共享显卡的服务器。

David Wheeler: Any problem in computer science can be solved by another layer of indirection.

安装方法 (Ubuntu)

首先安装依赖:

1
2
3
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

执行一键安装脚本:

1
curl https://pyenv.run | bash

如果上面的失败可以试试下面这个:

1
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

然后把出现的一段放到 .bashrc 末尾:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Load pyenv automatically by appending
# the following to
# ~/.bash_profile if it exists, otherwise ~/.profile (for login shells)
# and ~/.bashrc (for interactive shells) :

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Restart your shell for the changes to take effect.

# Load pyenv-virtualenv automatically by adding
# the following to ~/.bashrc:

eval "$(pyenv virtualenv-init -)"

再执行 . .bashrc 重新加载配置文件,这样就安装好了。

安装方法 (Windows)

在 PowerShell 里运行如下:

1
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"

如果需要换源,对 ~/.pyenv/pyenv-win/.version_cache.xml 文件进行一个全局替换,把 https://www.python.org/ftp/python 替换为 https://cdn.npmmirror.com/binaries/python,然后就可以正常使用啦!

需要注意的是,pyenv-win 相比于 pyenv 有一个区别:在 pyenv 中我们可以使用大版本号去进行前缀匹配,例如 pyenv shell 3.7 就可以自动定位到 3.7.x 版本(前提是只存在一个 3.7.x 版本),而在 pyenv-win 中则需要精确提供版本,不然会报 pyenv specific python requisite didn't meet. Project is using different version of python. 的错误。

幸运的是,经过测试,pyenv-win 对于 .python-version 的前缀匹配是完美兼容的,这意味着与 pyenv 具有很好的兼容性。

用法

1
2
3
4
5
6
pyenv install --list # 列出可供安装的版本
pyenv install x.x.x # 安装指定版本
pyenv versions # 列出本地已安装的版本
pyenv shell x.x.x # 切换到指定版本 (PYENV_VERSION)
pyenv local x.x.x # 指定目录使用的特定版本 (./.python-version)
pyenv global x.x.x # 指定全局使用的特定版本 (~/.pyenv/version)

推荐阅读

哦对了

千万不要手贱执行 sudo apt remove python

用 pyenv 管理 Python 版本

https://mmdjiji.com/2024/03/2/

作者

吉吉

发布于

2024-03-27

更新于

2024-04-16

许可协议