跳转至

pyenv 管理Python环境

概要: 使用pyenv工具管理多个版本的Python环境

创建时间: 2023.03.22 00:42:08

更新时间: 2023.11.13 23:18:38

安装配置pyenv

安装依赖

参考install pyenv,首先需要安装依赖

macOS

Bash
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target

Debian Linux

Bash
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

RedHat Linux

Bash
sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel

Alpine Linux

Bash
apk add libffi-dev ncurses-dev openssl-dev readline-dev tk-dev xz-dev zlib-dev

安装pyenv

使用下面的命令可以安装pyenv及其官方插件

Bash
curl https://pyenv.run | bash
image.png
其中包含

  1. pyenv 主要工具
  2. pyenv-virtualenv 插件,管理基于pyenv的虚拟环境
  3. pyenv-update 插件,检查pyenv更新
  4. pyenv-doctor 插件,检查pyenv的依赖是否已安装
  5. pyenv-installer 插件,安装卸载指定版本Python

image.png

更新pyenv

警告

需要安装update插件

Bash
pyenv update

卸载pyenv

Bash
rm -rf $(pyenv root)

警告

注意移除掉下面小节在shell中注入的环境变量和命令

使用brew管理pyenv

安装

Bash
brew update
brew install pyenv pipenv pyenv-virtualenv pyenv-virtualenvwrapper pyenv-which-ext
升级
Bash
brew upgrade pyenv
卸载
Bash
1
2
3
brew remove pyenv
# 可选,手动移除pyenv目录,同脚本安装
rm -rf $(pyenv root)

警告

使用通用脚本安装的pyenv,不能使用brew进行更新!

检查是否正确安装

警告

需要安装doctor插件

Bash
pyenv doctor
看到下面表示已正确安装
image.png

查看版本

Bash
pyenv --version
image.png

配置shell环境

为保证pyenv工具的正常工作,需要在shell启动时注入部分环境变量,并初始化pyenv,详细参考pyenv/pyenv: Simple Python version management

此处以zsh环境为例,bash类似

Bash
1
2
3
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

刷新shell 如果要使当前终端生效,需要重启或刷新shell环境

Bash
exec "$SHELL"

配置国内源

【可选,建议】

考虑到国内Python官方源速度较慢,可以考虑使用国内淘宝源进行替代,在使用的shell环境中增加注入如下环境变量

Bash
1
2
3
echo 'export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1' >> ~/.zshrc
echo 'export PYTHON_BUILD_MIRROR_URL="https://npmmirror.com/mirrors/python/"' >> ~/.zshrc
echo 'export PYTHON_BUILD_ARIA2_OPTS="--check-certificate=false"' >> ~/.zshrc

环境变量

  • PYENV_ROOT: 更改 pyenv 的默认安装地址
  • PYTHON_BUILD_MIRROR_URL: 下载 Python 源码时的镜像地址
  • PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM: 是否在编译 Python 时跳过文件校验和
  • PYTHON_BUILD_ARIA2_OPTS: 下载 Python 源码时使用的 aria2 参数(通过设置为--check-certificate=false,可以解决下载过程中的证书问题)
  • PYTHON_BUILD_HTTP_CLIENT: 下载 Python 源码时使用的 http 客户端,支持 curlwgetaria2,默认为 curl

更多的环境变量参考此处

使用pyenv

所有的pyenv命令行均可以在pyenv/COMMANDS.md找到

查看所有可安装版本

Bash
pyenv install --list
这将输出一段很长的列表,基本支持所有能想象到的Python版本

install 安装指定版本

Bash
pyenv install x.y.z

关于版本号 x.y.z

  • 如果未指定小版本 y 或者补丁版本 z,那么将会安装最新大/小版本
  • pyenv install 3 会安装最新的 Python 3.11.2 版本
  • pyenv install 3.9 会安装最新的 Python 3.9.16 版本

image.png

uninstall 移除指定版本

Bash
pyenv uninstall x.y.z

global 指定默认版本

Bash
1
2
3
pyenv global x.y.z
# 或者直接使用已创建的虚拟环境
pyenv global py10test
image.png

local 指定当前app环境版本

Bash
1
2
3
pyenv local x.y.z
# 或者直接使用已创建的虚拟环境
pyenv local py10test
image.png
image.png

which 查看当前工具路径

下面的命令查看当前shell中pip工具的路径

Bash
pyenv which pip
下面的命令查看当前用户默认pip工具的路径
Bash
which pip
下面的命令查看当前shell中pip的版本和路径
Bash
pip --version
image.png
可以看到pyenv定位到的是当前shell中Python环境的可执行命令行工具的实际路径

shell 以某个版本启动shell

Bash
pyenv shell x.y.z
image.png

version 查看当前使用版本

Bash
pyenv version
image.png

versions 查看系统所有版本

Bash
pyenv versions
image.png
其中带*号的是当前环境的所用版本
那么如何理解系统中众多的Python环境版本?
参考下图(图源RealPython
image.png

  1. 底层是系统自带的Python环境
  2. 其次是pyenv的global环境(在 ~/.pyenv/version 文件描述)
  3. 再者是pyenv的local环境(在shell启动时路径的 .python-version 文件描述)
  4. 最后也就是最上层的手动调起的pyenv环境(通过pyenv调起的环境,通过环境变量$PYENV_VERSION描述)

虚拟环境

警告

需要安装virtualenv插件

创建虚拟环境

指定版本号

Bash
# pyenv virtualenv <python_version> <environment_name>
pyenv virtualenv 3.11.2 py11test

不指定版本号

如果在 virtualenv 后没有版本号参数那么创建的虚拟环境将基于当前使用的Python版本

Bash
pyenv virtualenv py11demo
image.png

激活虚拟环境

Bash
pyenv activate py11test

退出虚拟环境

Bash
pyenv deactivate
image.png

查看虚拟环境

Bash
pyenv virtualenvs
image.png

删除虚拟环境

Bash
pyenv uninstall py11demo
image.png

FAQ

pyenv安装Python时提示 ModuleNotFoundError: No module named '_tkinter'

image.png
此处以Fedora38为例,安装如下工具包即可

Bash
sudo dnf install tk-devel python3-tkinter

pyenv安装Python时提示 ModuleNotFoundError: No module named '_sqlite3'

Bash
pyenv install 3.12                       
pyenv: /media/vdb/softwares/dev-envs/pyenv/versions/3.12.0 already exists
continue with installation? (y/N) y
Downloading Python-3.12.0.tar.xz...
-> https://npm.taobao.org/mirrors/python/3.12.0/Python-3.12.0.tar.xz
Installing Python-3.12.0...
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/media/vdb/softwares/dev-envs/pyenv/versions/3.12.0/lib/python3.12/sqlite3/__init__.py", line 57, in <module>
    from sqlite3.dbapi2 import *
  File "/media/vdb/softwares/dev-envs/pyenv/versions/3.12.0/lib/python3.12/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3'
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installed Python-3.12.0 to /media/vdb/softwares/dev-envs/pyenv/versions/3.12.0
解决方法,添加对应的包即可
Bash
sudo dnf install sqlite sqlite-devel

更多

几乎每一种语言都有自己的依赖包管理系统,如何能“简化”这些操作,可以了解一下asdf工具,它可以管理Ruby, Node.js, Elixir, Erlang, Python等众多语言的依赖包

参考