在Linux上使用pyenv管理Python版本

img

解决痛点

0x00 前言

前一阵把Kali更新到了2023.3版,最近在练习过程中,某个环境需要用docker-compose来搭建。按照以前的经验还是一步一步安装,刚安装docker-composer就给报错了,看了一下报错问题,是某个支持包的许可已经废弃了,查了一下docker-compose的支持情况,发现对Python支持最大到3.9版本,而kali 2023.3的默认Python版本为3.11,导致了最终的安装失败。细想下来其实以前在寻找一些工具或者开发时候也会遇到这种由于Python版本不一致而导致的问题,索性就一次性解决,我在使用node时候,都是用nvm进行管理,那么Python肯定也有类似的工具了,经过查找和对比,最终决定使用pyenv这个工具。

0x01 安装pyenv

官方文档上提供了三种安装方式,第一种是使用Homebrew,第二种是自动安装脚本,第三种是clone仓库自己编译安装。由于我不想再引入其他可能存在的问题,所以直接排除了第一种和第三种。直接用自动安装脚本。

1
curl https://pyenv.run | bash

安装后会提示你配置环境变量,在~/.profile~/.zshrc中添加下面的配置:

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

~/.zshrc中额外添加下面的配置:

1
eval "$(pyenv virtualenv-init -)"

安装完成之后重启shell,接着使用pyenv --version查看是否已经安装成功。

0x02 安装其他版本的Python

在安装完成之后,可以通过pyenv install <version>方式来安装需要的版本。但是此时如果安装还是会报错,由于pyenv安装Python时候,使用编译的安装方式,所以还需要安装编译所需要的依赖。

1. Ubuntu/Debian/Mint

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

其他操作系统依赖项参考这份文档

0x03 如何使用

例如:如果你想安装并python3.9版本,可以这样操作:

1
pyenv install 3.9

上述命令使用pyenv安装Python3.9版,安装如果遇到问题,请参考这份文档

然后切换到3.9版本:

1
2
pyenv global 3.9
python --version #第一次切换时候,查看python版本时候可能还是系统版本,这时候重启一下终端即可,后面再次切换时候可以即时生效。

大功告成。如果你想查看pyenv支持的所有版本可以使用pyenv install -l

在选择Python版本时候,还有其他几个命令可以参考:

  • pyenv shell <version> 在当前shell中生效
  • pyenv local <version> 在当前目录(或其子目录)中生效
  • pyenv global <version> 在当前用户下全局生效

更多内容可以参考:https://github.com/pyenv/pyenv#automatic-installer