概述

pyenv 是一个 python 多版本管理工具,python 的版本以及依赖管理和其他编程软件的不太一样,如果电脑上只有一个版本的 python,而其他项目依赖的 python 版本又不一样时,会变得很麻烦,pyenv 就可以很好的解决这个问题

pyenv 支持电脑上同时安装多个版本的 python,每个版本的 python 存放在单独的文件夹,可以将任意一个版本的 python 设置成全局共用(global)的版本,也可以为当前项目(local)指定一个 python 版本,而且每个版本自己的 pip 下载的依赖包也只会存放在它自己的文件夹下,不用担心依赖包混在一起

pyenv-win github 地址:https://github.com/pyenv-win/pyenv-win

运行原理

pyenv 会将各个版本的 python 放在它目录下的 versions 文件夹中,比如安装了 3.10.0、3.9.1 两个版本的 python,那么就会有两个文件夹 versions/3.9.1、versions/3.10.0,从物理上就达到了隔离效果

在环境变量的配置上,我们都不需要将 python 的 bin 目录加入到 PATH 中,而是只需要把 pyenv 提供的 bin 目录以及它的 shims 目录加入到 PATH,再创建 3 个 pyenv 的环境变量(PYENV、PYENV_HOME、PYENV_ROOT)即可

shims

上面提到了 shims,它是 pyenv 提供的一个叫垫片的概念,pyenv 的目录下,和 bin 目录同一级有一个叫 shims 的目录,这个目录在刚部署 pyenv 时是空的,当设置了 python 版本之后,这个目录下就会出现很多脚本文件,它们的名称和 python 提供的可执行程序的名称是一样的,这就是 shims,通俗的讲就是相当于给 python 的可执行程序都加了一个代理层

比如我们用 pyenv 安装了 3.9.1、3.10.5 两个版本的 python,并设置了 3.9.1 作为全局 python 之后,再直接 win + r 打开 cmd 命令行,从命令行里执行 pip install xxx,并不会直接执行到 python 提供的 pip 程序,而是根据 PATH 环境变量,找到 pyenv 在 shims 目录下提供的 pip.bat,由它根据当前环境指定的 python 版本,定位到真正的 pip 程序来执行,从而达到 pyenv 管理多版本 python 的效果

常用命令

   commands     列出 pyenv 可用的命令
   local        设置或者查看当前应用的 python 版本(从命令行当前目录一直往上找 .python-version 文件)
   latest       根据给定的前缀,打印出这个前缀的安装的最新版本
   global       设置或者查看全局的 python 版本
   shell        设置或显示特定于 shell 的 Python 版本
   install      安装指定版本的 python
   uninstall    删除指定版本的 python
   update       更新 pyenv 缓存的版本数据库
   rehash       刷新 pyenv 的 shims (在切换了版本之后执行)
   vname        显示当前 python 版本,和下面的 version-name 参数一样效果
   version      显示当前 python 版本,并显示版本文件存放位置
   version-name 显示当前 python 版本
   versions     显示 pyenv 安装的所有 python 版本
   exec         跳过 shims 层,直接根据当前路径一直找到最近的 .python-version 文件,确定好版本,
                最后用这个版本的python可执行程序来执行。
   which        显示某个命令当前真正可执行程序的全路径,比如 pyenv which pip 找到当前环境pip程序路径
   whence       列出某个命令在哪些版本的python中存在,比如 pyenv whence iopaint 可以看到
                哪些版本 python 装了 iopaint

安装

前提:

如果当前电脑还安装有 python,要先卸载掉,不然 pytenv 在使用的时候会报错

1、直接将 master 分支下载下来,并解压

https://github.com/pyenv-win/pyenv-win/archive/master.zip

假设解压到 D:/software/

解压后目录结构大致如下:

D:/software/pyenv-win-master/
  |-docs/
  |-pyenv-win/
    |-bin/
    |-libexec/
    |-.versions_cache.xml
    |-__init__.py
    |-install-pyenv-win.ps1
  |-tests/
  |-LICENSE
  |-README.md
  |-_config.yml
  |-mirrors.txt
  |-requirements.txt
  |-requirements_dev.txt
  |-setup.py
  ...
  ...

2、创建 shims 文件夹

在 pyenv-win 目录下创建一个名为 shims 的文件夹(和 bin 目录同一级),这个文件夹用来给 pyenv 存放全局范围的 python 的可执行文件的映射层(或者说叠片(shims))

3、新增环境变量

创建 3 个环境变量,PYENV、PYENV_HOME、PYENV_ROOT,这 3 个环境变量的值都填 pyenv-win 这个目录的绝对路径,例如

PYENV=D:\software\pyenv-win-master\pyenv-win
PYENV_HOME=D:\software\pyenv-win-master\pyenv-win
PYENV_ROOT=D:\software\pyenv-win-master\pyenv-win

4、将 pyenv 可执行文件目录加入 PATH

将 pyenv-win/bin 和 pyenv-win/shims 这两个目录的绝对路径加入 PATH 环境变量中

PATH=%PYENV_HOME%\bin;%PYENV_HOME%\shims;%PATH%

试用一下

目的:安装 3.9.13、3.10.5 两个版本 python,并设置 3.10.5 为系统默认的 python 环境。新建一个文件夹当作一个项目,将这个文件夹下的 python 环境指定为 3.9.13

开始操作:

列出可以安装的 python 版本

pyenv install -l

安装 python 3.9.13 和 3.10.5

pyenv install 3.9.13 3.10.5

将 3.10.5 版本设置为电脑默认 python 环境

pyenv global 3.10.5

win + r 打开 cmd,执行 python --version 看看是不是成功了

随便新建一个文件夹,我这里就创建个 D:\test 文件夹,cmd 进入这个文件夹,查看当前环境的版本

pyenv version

得到的是 3.10.5,因为上面将 3.10.5 设置成了系统默认使用的版本

单独设置这个文件夹的版本

pyenv local 3.9.13

执行完可以看到当前文件夹下多了一个 .python-version 文件,定义了当前文件夹使用 python 3.9.13

再在这个文件夹下创建一个子文件夹 ttt,cd 进入到 ttt 里面查看当前文件夹的版本

cd ttt
pyenv version

执行完可以看到版本还是 3.9.13,因为 pyenv 会根据当前路径一直往上层找,找到最近的一个 .python-version 文件,使用它定义的版本号,如果找到头了也没找到 .python-version,那么就会使用设置的系统默认(global)的版本号