为何pyenv versions命令结果显示两个启用的Python版本?
pyenv显示多个启用Python版本的解析
一、出现多个启用版本的原因
pyenv允许在不同作用域下设置Python版本,当你同时在全局、本地目录或当前shell会话中设置了不同版本时,pyenv versions就会给这些被设置的版本都打上*标记,看起来像是多个版本同时启用。
比如:
- 你用
pyenv global 3.9.18设置了全局版本 - 又在某个项目目录下执行
pyenv local 3.10.12设置了目录专属版本
进入该目录执行pyenv versions,就会看到3.9.18和3.10.12都带*,但实际当前生效的是优先级更高的本地版本3.10.12。
二、这个特性的定义
这里的"启用"并非指多个版本同时运行,而是指该版本在某个作用域下被主动设置。pyenv的版本管理分为三个作用域:
- Shell会话级:通过
pyenv shell <版本号>设置,仅对当前打开的shell窗口生效,关闭窗口后失效 - 目录本地级:通过
pyenv local <版本号>设置,对当前目录及所有子目录生效,设置后会在目录下生成.python-version文件记录版本 - 用户全局级:通过
pyenv global <版本号>设置,对当前用户的所有shell会话生效,版本记录在~/.pyenv/version文件中
三、工作原理
pyenv核心靠shims(垫片)机制实现版本切换:
- 安装pyenv时,它会把
~/.pyenv/shims目录添加到系统PATH的最前端 - 当你执行
python、pip等命令时,系统会优先调用shims目录下的对应脚本 - shim脚本会按优先级顺序查找要使用的Python版本:
- 首先检查当前shell的
PYENV_VERSION环境变量(对应shell级设置) - 然后查找当前目录下的
.python-version文件(对应本地级设置) - 接着查找
~/.pyenv/version文件(对应全局级设置) - 最后 fallback 到系统自带的Python版本(标记为
system)
- 首先检查当前shell的
pyenv versions命令会遍历所有已安装的Python版本,只要某个版本在上述任意一个作用域中被设置,就会给它打上*标记,从而出现多个带星号的版本,但实际运行时只会使用优先级最高的那个版本。
内容的提问来源于stack exchange,提问作者Dachuan Huang
相关产品推荐
相关产品推荐

