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

具体来说,Python 版本管理工具有以下功能:

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

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

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

(4)共享环境配置,提高开发环境一致性。可以将环境配置文件(如 requirements.txtpyproject.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 中使用 Python 3.8,而在项目 B 中使用 Python 3.9。通过 pyenv 和 Shims,你可以在项目目录中分别设置 Python 版本:

# 在项目 A 目录中
pyenv local 3.8.10 # 在项目 B 目录中
pyenv local 3.9.5

(2)当你在项目 A 目录中运行 python 命令时,Shims 会确保调用的是 Python 3.8.10,而在项目 B 目录中则会调用 Python 3.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

Python 版本管理工具选择与 Pyenv 使用说明的更多相关文章

  1. python版本管理工具pyenv和包管理工具pipenv

    一.pyenv版本管理工具 pyenv是一个python版本管理工具,可以实现轻松切换多个python版本 它可根据每个用户更改全局python版本,也可以为每个项目指定python版本,还可以管理v ...

  2. 腾讯云服务器ubuntu16.04系统下安装Python版本管理工具pyenv

    一. 系统环境   腾讯云提供的系统是ubuntu 16.04 LTS,系统默认的Python版本是2.7.12,我想要安装3.6和其他的版本.   比较方便的是腾讯云已经默认安装好了git和curl ...

  3. Ubuntu安装Python版本管理工具pyenv

    gyf@gyf-VirtualBox:~$ git clone https://github.com/yyuu/pyenv.git ~/.pyenvCloning into '/home/gyf/.p ...

  4. python 版本管理工具 pyenv 使用备忘

    安装步骤 安装 xcode-select 以及 homebrew(前者在安装 git 的时候装过,后者 mac 开发必备无需解释) 安装 pyenv brew install pyenv,用 pyen ...

  5. Python生态工具、文本处理和系统管理(虚拟)

    一.Python生态工具 一.Python内置小工具 1.秒级启动一个下载服务器 Python 内置了一个下载服务器就能够显著提升效率了 . 例如, 你的同事要让你传的文件位于某一个目录下,那么,你可 ...

  6. python 管理工具

    pip 包管理工具 virtualenv 虚拟环境管理工具 切换目录 virtualenvwrapper 虚拟环境管理工具加强版 pyenv python版本管理工具 修改环境变量 pyenv-vir ...

  7. Python多版本共存之pyenv

    经常遇到这样的情况: 系统自带的Python是2.6,自己需要Python 2.7中的某些特性: 系统自带的Python是2.x,自己需要Python 3.x: 此时需要在系统中安装多个Python, ...

  8. Python 多版本共存之pyenv

    经常遇到这样的情况: 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性: 系统自带的 Python 是 2.x,自己需要 Python 3.x: 此时需要在系统中安装 ...

  9. 你应该学会的Python多版本管理工具Pyenv

    目录 Pyenv 简介 安装pyenv 通过pyenv安装python各种发行版 pyenv命令 多版本Python的管理 Pyenv常见问题Wiki Pyenv 简介 首先,该工具是在类linux环 ...

  10. python多版本管理工具(pyenv)

    在学习和利用python开发的很多情况下,需要多版本的Python并存.此时需要在系统中安装多个Python,但又不能影响系统自带的 Python.pyenv 就是这样一个 Python 版本管理器. ...

随机推荐

  1. Mysql通过frm和ibd恢复数据库

    昨天的考试过程中,有个考点的服务器蓝屏重启后发现Mysql启动不了(5.6.45 x32版本,使用innoDB),重装后无法加载原数据库记录,通过查询资料,通过frm和idb文件成功恢复了数据库记录. ...

  2. oeasy 教您玩转 linux 之 010301 电子宠物 pet

    我们来回顾一下 上一部分我们都讲了什么? 中️文诗词fortune=zh的使用 建立自己的彩色诗词库 通过pip把输出结果交给cowsay或boxes 我们这次讲一讲桌面的一些应用 oneko 我们可 ...

  3. oeasy教您玩转vim - 73 - # 映射map

    ​ 映射map 回忆上次缩写的细节 这次了解到了:abbrivate缩写 可以定义缩写 :ab o1z oeasy 这里面还可以包括方向键.回车键之类的东西 可以定义到指定的模式 iab cab 查看 ...

  4. ios证书免费分享

    首先,ios证书能不能分享给别人使用,能否用别人的证书打包呢? 这个问题的答案在技术上是肯定可以的,但是我要解释一下,技术上可以,不代表真的就可以这样做,为什么呢? 首先,假如用别人的苹果开发者账号的 ...

  5. 从DDPM到DDIM(四) 预测噪声与后处理

    从DDPM到DDIM(四) 预测噪声与后处理 前情回顾 下图展示了DDPM的双向马尔可夫模型. 训练目标.最大化证据下界等价于最小化以下损失函数: \[\boldsymbol{\theta}^*=\u ...

  6. docker 容器挂载技术

    创建和使用桥接网络 docker network create --driver bridge --subnet 192.168.13.0/24 --gateway 192.168.13.1 mqyn ...

  7. awk替换指定行指定列内容

    例如表格中数值如下1,2,3,41,2,1,22,3,2,3怎么样在原表中,把第二行第三个1替换为5. awk -F"," 'NR==2{$3=5} 1' file.txt -F ...

  8. 【DataBase】MySQL 07 SQL函数 单行函数其一 字符函数

    SQL函数的概念 -- SQL函数 -- 概念:类似Java的方法,将已经定义好的不再改变的逻辑语句封装在函数体内,对外提供方法的标识 -- 隐藏了实现细节,提高功能的可重用 -- SELECT 函数 ...

  9. Regardless of the outcome of the Russia-Ukraine war, how can Ukraine avoid paying the weapon fees to the United States after the war?

    According to the agreement between the Ukrainian government and the United States, regardless of the ...

  10. 深度学习框架:为啥不同的框架,不同的运行设备(GPU/CPU/NPU),运算出的结果性能会有一定百分数的差别呢

    经常会遇到有人在网上说,TensorFlow的计算结果比pytorch的高上几个百分点,也有人说RTX3090的计算结果没有A100的好,还有人说NPU的计算结果比GPU的高,而且这种说法在业内也是极 ...