
windows 安装 pyenv 管理多版本 python
概述
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)的版本号