久趣下载站

当前位置: 首页 » 游戏攻略 » Python版本管理工具Pyenv详解

Python版本管理工具Pyenv详解

Python版本管理工具的主要作用是帮助开发者在同一台机器上管理多个Python版本和环境。这对于开发和部署不同项目非常有用,因为不同项目可能依赖不同的Python版本或不同的包版本。具体来说,Python版本管理工具应有以下功能:

1. 避免依赖冲突,不同的项目可能依赖不同版本的库,使用版本管理工具可以创建独立的虚拟环境,避免依赖冲突。

2. 简化开发流程,开发者可以轻松地在不同的Python版本之间切换,而不需要重新安装或配置Python。

3. 便于部署,减少冲突。在开发环境中使用与生产环境相同的Python版本和依赖,可以减少部署时出现的问题。

4. 共享环境配置,提高开发环境一致性。可以将环境配置文件(如

requirements.txt



pyproject.toml

)共享给团队成员,确保大家使用相同的开发环境。

一、工具选择

常见的管理工具有Pyenv和Conda。Pyenv是当前最流行的Python版本管理工具,支持多种Python版本,如CPython、Anaconda、PyPy等,功能全面且简单易用。Conda最初由Anaconda, Inc.开发,主要用于Python和R编程语言的软件包(含Python)及环境管理,特别适合跨平台、多语言项目,Python版本管理只是其一小部分功能,若仅用于管理Python版本,Conda有些大材小用,且系统较复杂、学习成本略高。相比之下,Pyenv是常规项目Python版本管理的最优选择。

以下详细介绍Pyenv的使用方法。

二、Pyenv安装


建议:

先卸载系统内置的Python,否则可能导致pyenv设置不生效。

1. Windows

pyenv本身是为Unix系统设计的。你可以使用pyenv-win这个项目,它是pyenv的Windows版本。

你需要在PowerShell中执行以下命令安装pyenv-win:

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"

重新打开PowerShell,运行pyenv –version检查安装是否成功。

2. Linux

你可以使用以下命令来安装

pyenv

curl https://pyenv.run | bash

之后再将pyenv配置到环境变量中并使之生效,执行如下命令:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

上述配置仅能使pyenv在bash环境生效,更多shell环境配置请参考:Set up your shell environment for Pyenv。配置的本质在于将$PYENV_ROOT下的shims和bin目录配置到PATH变量中,且shims需配置在前。配置后的PATH如下:

[root@2e7669577b11 /]# echo $PATH
/root/.pyenv/shims:/root/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

三、Pyenv基本用法

# 查看帮助文档
pyenv

# 查看某个命令帮助文档
pyenv install --help

# 查看版本
pyenv version

# 检查Python是否正常运行
python -c "import sys; print(sys.executable)"

# 查看已安装的Python版本
pyenv versions

# 查看当前使用的Python版本
pyenv version

# 查看所有可用的Python版本
pyenv install --list 

# 安装指定版本
pyenv install 3.9.1

# 验证
python --version

# 卸载指定版本
pyenv uninstall 3.9.1

# 全局指定Python版本(影响所有项目)
pyenv global 3.9.1 

# 局部指定Python版本(仅影响当前项目目录),指定后在当前项目目录内创建.python-version文件,保存版本信息
# 优先级高于global
pyenv local 3.9.1

# 会话级指定Python版本(影响所有项目)
pyenv shell 3.9.1 

# 查看python的安装目录
pyenv which python

# 重新生成pyenv的shims目录中的可执行文件
pyenv rehash 

Python安装常见问题,可参考:Python common build problems

四、Pyenv核心原理 – Shims

pyenv通过Shims实现了对不同Python版本的透明管理和切换。

1. 工作原理

上述环境配置中,在PATH环境变量最前面插入一个shims目录,

$(pyenv root)/shims:$(pyenv root)/bin:/usr/local/bin:/usr/bin:/bin

。通过一个称为rehashing的过程,pyenv在该目录中维护垫片,以匹配每个已安装的Python版本中的每个Python命令,如:python、pip等。

Shims是轻量级可执行文件,它只是将你的命令传递给pyenv。因此,在安装了pyenv的情况下,当你运行pip时,你的操作系统将执行以下操作:

(1)搜索PATH环境变量,寻找pip可执行文件

(2)在$(pyenv root)/shims中找到pip

(3)运行名为pip的shim,它将命令传递给pyenv

2. 作用

(1)通过使用Shims,pyenv可以实现对不同项目使用不同Python版本的灵活管理,而不需要手动修改环境变量或路径。

(2)你可以方便地在全局、目录级别甚至是shell会话级别设置或切换Python版本,极大地方便了开发和测试工作。

3. 示例

(1)假设你在项目A中使用Python3.8,而在项目B中使用Python3.9。通过pyenv和Shims,你可以在项目目录中分别设置Python版本:

# 在项目A目录中
pyenv local 3.8.10

# 在项目B目录中
pyenv local 3.9.5

(2)当你在项目A目录中运行

python

命令时,Shims会确保调用的是Python3.8.10,而在项目B目录中则会调用Python3.9.5。

通过这种方式,Shims实现了对不同Python版本的透明管理和切换。

五、Pyenv初始化操作源码解读

1. pyenv init –

用于初始化pyenv,使其在当前shell会话中工作。运行后,执行如下命令(相关说明附在注释中):

# 1.PATH变量处理
## 该脚本将当前的PATH变量拆分为一个数组paths,并赋予
## 通过遍历paths数组,检查每个路径是否为'/root/.pyenv/shims',如果是,则将其移除
PATH="$(bash --norc -ec 'IFS=:; paths=($PATH); 
for i in ${!paths[@]}; do 
if [[ ${paths[i]} == "''/root/.pyenv/shims''" ]]; then unset '\''paths[i]'\''; 
fi; done; 
echo "${paths[*]}"')" # 

# 2. 更新PATH变量
## 将'/root/.pyenv/shims'添加到PATH变量的最前面
export PATH="/root/.pyenv/shims:${PATH}"
## 设置PYENV_SHELL环境变量为bash,sh环境下,输出的是shell
export PYENV_SHELL=bash
## sh环境下,无该行代码,bash环境下执行改行的作用是:source命令加载pyenv的自动补全脚本
source '/root/.pyenv/libexec/../completions/pyenv.bash' 
## 通过command命令执行pyenv rehash(主要作用是重新生成pyenv的shims目录中的可执行文件),并将错误输出重定向到/dev/null
command pyenv rehash 2>/dev/null

# 3. 定义一个pyenv函数,该函数根据不同的子命令执行不同的操作
## 如果子命令是activate、deactivate、rehash或shell,则通过eval执行pyenv "sh-$command"
## 对于其他子命令,直接调用command pyenv "$command" "$@"
pyenv() {
  local command
  command="${1:-}"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  activate|deactivate|rehash|shell)
    eval "$(pyenv "sh-$command" "$@")"
    ;;
  *)
    command pyenv "$command" "$@"
    ;;
  esac
}

2. pyenv init –path

用于设置PYENV_ROOT环境变量,使得pyenv可以找到安装的Python版本。

pyenv init -

包含

pyenv init --path

操作。

sh或bash环境运行后,执行如下命令:

## 该脚本将当前的PATH变量拆分为一个数组paths,并赋予
## 通过遍历paths数组,检查每个路径是否为'/root/.pyenv/shims',如果是,则将其移除
PATH="$(bash --norc -ec 'IFS=:; paths=($PATH); 
for i in ${!paths[@]}; do 
if [[ ${paths[i]} == "''/root/.pyenv/shims''" ]]; then unset '\''paths[i]'\''; 
fi; done; 
echo "${paths[*]}"')"
## 将'/root/.pyenv/shims'添加到PATH变量的最前面
export PATH="/root/.pyenv/shims:${PATH}"
## 通过command命令执行pyenv rehash,并将错误输出重定向到/dev/null
command pyenv rehash 2>/dev/null

六、参考文章

pyenv

Python common build problems

猜你喜欢
本类排行