前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pyenv 神器原理分析

pyenv 神器原理分析

原创
作者头像
Coder Sam
修改于 2020-03-03 14:53:30
修改于 2020-03-03 14:53:30
3.8K0
举报
文章被收录于专栏:Coder Sam的专栏Coder Sam的专栏

pyenv 是什么

  • Python 多版本及虚拟环境管理器,支持:
    • 使用与系统不同的 Python 版本或虚拟环境
    • 每个项目使用不同的 Python 版本或虚拟环境
    • 通过环境变量切换不同的 Python 版本或虚拟环境
    • 同时使用多个 Python 版本或虚拟环境的命令
    • ……

pyenv 干什么

解决两种场景的问题……

场景一:一台机器同时安装 Python 2.6、2.7、3.8

一个传统的方案是每个版本的 Python 可执行文件使用不同的名字,如 python、python2.6、python3。

image.png
image.png

这种方案需手动指定python版本,使用起来很不方便:

python manage.py runserver

python3 manage.py runserver

python2.6 manage.py runserver

场景二:一台机器同时使用同一个 Python 库的不同版本

这个场景的典型工具为 virtualenv 和 pyvenv(各工具介绍见《一文了解virtualenv、pyvenv、pyenv、pyenv virtualenv》)。但使用时需要手动激活和注销要使用的虚拟环境,比较麻烦。

image.png
image.png

使用 pyenv 之后

代码语言:txt
AI代码解释
复制
# 安装各版本的 Python
pyenv install 2.7.17
pyenv install 3.7.6
pyenv install 3.8.2

# 创建各版本对应的虚拟环境
pyenv virtualenv 2.7.17 venv2
pyenv virtualenv 3.8.2 venv3

# 使用 Python 版本或虚拟环境
pyenv global 2.7.17	# 所有项目默认使用 Python 2.7.17
pyenv local 3.8.2	# 本目录及子目录使用 Python 3.8.2
pyenv local venv2	# 本目录及子目录使用基于 Python 2.7.17 的虚拟环境 venv2
pyenv shell venv3	# 当前 shell 临时使用基于 Python 3.8.2 的虚拟环境 venv3

更重要的是,pyenv 使用了垫片的原理,使用某个 Python 版本或虚拟环境完全是自动的,无需手动指定。例如上面例子设置了 pyenv local venv2,那么进入该目录及其子目录,自动使用的就是基于 Python 2.7.17 的虚拟环境 venv2,而离开该目录后又自动切换到其他 Python 版本或虚拟环境了。

pyenv 执行命令原理

有位伟人说过:

代码语言:txt
AI代码解释
复制
Any problem in computer science can be solved by another layer of indirection.
代码语言:txt
AI代码解释
复制
——计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

pyenv 就是使用了中间层的原理来实现的的,即 shims/垫片。

初始化 pyenv

安装 pyenv 后,需要在当前 shell 的配置文件(bash 为 ~/.bashrc,zsh 为 ~/.zshrc 等等)中增加相应命令:

代码语言:txt
AI代码解释
复制
# vim ~/.bashrc
export PATH="/data/sammyshen/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

这几个命令在每次登陆 shell 时,会更改 PATH 环境变量,将 pyenv 的路径加入到 PATH 环境变量前面。例如:

image.png
image.png

shims/垫片的简化基本原理

Linux 执行命令时,是依次遍历 PATH 环境变量的每个路径,查找所执行的命令。当在某个目录下找到第一个匹配时即停止遍历,所以 PATH 环境变量中,前面的路径比后面的路径具有更高的优先级。

这是垫片原理的一个简化示例:

image.png
image.png

可以看到,在修改 PATH 之前,python 命令使用的是 /usr/bin/python。但通过 export PATH=$PWD:$PATH 将当前路径加入到 PATH 环境变量前面后,python 命令使用的就是当前目录下名为 python 的脚本了。

pyenv 在 ~/.pyenv/shims 目录下创建了各种 python 相关命令的垫片(~/.bashrc 中加入的命令调用 pyenv-rehash 生成的,pyenv install 命令也会调用 pyenv-rehash 进行更新):

image.png
image.png

所以当我们执行 python 相关的命令时,实际执行的是这些垫片。

这些垫片的内容都是相同的:

image.png
image.png

从脚本内容可以看出,当我们执行某个命令 program "param1" "param2" ……时,实际执行的是 pyenv exec "program" "param1" "param2" ……。

例如执行 python -V,实际执行的是 pyenv exec python -V。

确定版本号

在 pyenv-exec 命令中,首先会调用 pyenv-version-name 确定 python 版本或虚拟环境版本,具体查找规则为:

image.png
image.png

确定与版本号对应的可执行文件

在 pyenv-exec 命令中,会再调用 pyenv-which 确定可执行文件 program 的路径。如果前面 pyenv-version-name 确定了 python 版本或虚拟环境版本,则使用 <pyenv 安装路径>/versions/<版本号>/bin/<程序名> 或 <pyenv 安装路径>/versions/<版本号>/env/<虚拟环境名>/bin/<程序名>,否则遍历所有版本号的安装路径,按顺序取第一个匹配到的可执行文件。

执行命令

确定与版本号对应的可执行文件路径 path 之后,执行以下命令:

exec -a program "$path" "param1" "param2" ……

(注:即执行 "$path" "param1" "param2",并使用 program 作为程序名,程序名即 shell 中的 $0,python 中的 sys.argv0)

例如执行 python -V,确定 pyenv 版本为 2.7.17,对应可执行文件为 ~/.pyenv/versions/2.7.17/bin/python,则执行命令为:

exec -a python ~/.pyenv/versions/2.7.17/bin/python -V

以上就是 pyenv 执行命令的基本原理了。

pyenv 版本管理原理

pyenv 管理版本主要使用三个命令:pyenv global、pyenv local、pyenv shell。

pyenv global

此命令检查版本是否存在,存在则往 <pyenv 安装路径>/version 文件中写入设置的版本号。

pyenv local

此命令检查版本是否存在,存在则往 <当前路径>/.python-version 文件中写入设置的版本号。

pyenv shell

此命令检查版本是否存在,存在则往 PYENV_VERSION 环境变量中写入设置的版本号。

pyenv-version-name 查找版本流程

按以下顺序依次查找版本号:

  1. PYENV_VERSION 环境变量
  2. <当前路径>/.python-version 文件
  3. 依次遍历上级目录的 .python-version 文件
  4. <pyenv 安装路径>/version 文件

如果都没有找到,则使用系统安装的 Python 版本。

以上就是 pyenv 版本管理的基本原理了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux环境下的 pyenv的安装
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
保持热爱奔赴山海
2019/09/18
1.1K0
一文了解virtualenv、pyvenv、pyenv、pyenv virtualenv
“生命苦短,我用 Python。”一句话说明了 Python 开发的便利性,这也是这么多开发者热衷 Python 的原因。
Coder Sam
2020/03/03
17.6K0
Python关键点笔记之使用 pyenv 管理多个 Python 版本依赖环境
从接触Python以来,一直都是采用virtualenv和virtualenvwrapper来管理不同项目的依赖环境,通过workon、mkvirtualenv等命令进行虚拟环境切换,很是愉快。
Jetpropelledsnake21
2019/04/18
1.6K0
Python多版本切换工具-Pyenv
为了安装Anaconda科学计算环境,控制好python版本,今天上午总算折腾好了。
py3study
2020/01/02
3.1K0
virtualenvwrapper + pyenv 打造多版本 Python 环境
前言 面对多个 Python 开发项目时,需要针对不同的项目创建相应的开发环境。通常情况下,使用 virtualenv 创建一个虚拟的独立 Python 环境,但是 virtualenv 创建的环境相对分散不便于管理。这里推荐使用 virtualenvwrapper 来创建集中的便于管理的 Python 环境,同时可以结合 pyenv 为不同的项目选定不同的 Python 版本。 virtualenvwrapper 安装 通过 pip 安装 virtualenvwrapper(Ps: 记住加上 sudo)
木制robot
2018/04/11
1.5K0
Python多版本神器-Pyenv
使用pyenv可以在一个操作系统上使用多个python版本,自由切换,无比顺畅。它的使用不依赖于Python,是一个简单、独立的纯 shell 脚本工具。
py3study
2020/01/06
5160
Python多版本神器-Pyenv
python学习之pyenv环境搭建
1.安装git,github地址为https://github.com/pyenv/pyenv-installer/ yum install git -y 2.安装python编译依赖环境 yum -y install gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel 3.创建python用户用于搭建pyenv python多版本管理环境 useradd pyth
py3study
2020/01/14
4340
python系列(五)centos6.x
  virtualenv 是针对python的包的多版本管理,通过将python包安装到一个模块来作为python的包虚拟环境,通过切换目录来实现不同包环境间的切换。
py3study
2020/01/10
4020
使用pyenv维护多版本python开发环境
开发不同的项目的时候有可能产生安装不同python 版本的需求,那么如何管理多个python版本呢?有大神开发了工具 --pyenv 来解决多版本管理的问题。
用户1278550
2018/08/09
5210
Python多版本管理器-pyenv 介绍及部署记录
在日常运维中, 经常遇到这样的情况: 系统自带的Python是2.x,而业务部署需要Python 3.x 环境, 此时需要在系统中安装多个Python版本,但又不能影响系统自带的Python 版本,即需要实现Python的多版本环境共存, pyenv就是这样一个Python版本管理器, 可以同时管理多个python版本共存! 简单的说,pyenv 可以根据需求使用户在系统里安装和管理多个Python 版本: - 配置当前用户的python的版本; - 配置当前shell的python版本; - 配置某个项目(目录及子目录)的python版本; - 配置多个虚拟环境.
洗尽了浮华
2018/12/27
1.5K0
使用 pyenv 搭建任意 python 环境
开发和部署的过程中,常常遇到 python 版本和环境导致的冲突不兼容问题,pyenv 能够完美解决。
泽霖
2023/11/29
3980
连仕彤博客pyenv环境部署
pyenv是一款Python多版本管理工具,它可以很好的管理Python解释器、Python版本和Python虚拟环境,对于日常开发中,是一款很有必要安装的利器。 安装依赖包 [python@vultr data]$ yum -y install gcc git make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel   安装pyenv [python@vultr data]$ curl
行 者
2018/04/17
6170
pyenv快速入门
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u011054333/article/details/82891843
乐百川
2019/07/02
4330
pyenv快速入门
【Python】03、python多版本
 CentOS6系统会自带一个较低版本的python,一般不使用系统自带的python版本,因为系统很多组件依赖于python比如yum,如果我们随意升级或者安装了些有冲突包可能会影响系统环境;我们需要再安装较高版本的python,而且在开发多个项目时,可能需要多个版本的Python,此时在进行Python版本切换时会比较麻烦,pyenv就提供了一种简单的方式。
py3study
2020/01/06
8700
python版本管理(python环境隔
这将是一篇比较短的文章。 我发文向来注重文章质量,营养不够的宁可不发,但是我相信很多人需要这篇文章。 之所以要去搞清楚这个问题,是我在把 vscode 的 inspector 设置为 pipenv 生成的虚拟环境是遇到了问题。2018-2月 vscode 添加了对 pipenv 的支持,检测到 Pipfile 以后,会将环境自动切换到当前项目的虚拟环境。但是我的咋就不行呢!我就开始折腾。这是一个比较漫长相信你们都不想经历的过程。希望你们搜到的第一篇文章就是这篇。相关关键字如下: vscode 对 pipenv 的支持, vscode 找不到 pipenv 创建的虚拟环境, vscode pipenv, pipenv vscode ...等等 希望能给你带来更多营养,我多说点 不知不觉,上面的内容可能要占本文一半以上了。。。 pyenv 和 pipenv 应该是目前主流的 python 版本控制和虚拟环境的工具了,下面内容都基于这两个。
py3study
2020/01/20
1.1K0
附001.Python多版本环境管理
由于Python的版本过多,且不同版本之间差异性较大。同时又因系统底层需要调用当前版本Python,所以不能随意变更当前系统Python版本。因此,在多版本共存的情况下,Python多环境管理工具非常重要,常见Python多环境管理工具有Pyenv和Virtualenv。
木二
2022/05/30
1K0
附001.Python多版本环境管理
赞!优雅的Python多环境管理神器!易上手易操作!
Python 的不同版本之间常常存在依赖关系和兼容性问题,为了方便开发人员在 不同项目中使用不同的版本 。
Python兴趣圈
2023/11/16
5.6K0
赞!优雅的Python多环境管理神器!易上手易操作!
Python多环境扩展管理
众所周知,Python发展至今,版本众多,在使用过程中经常遇到第三方库依赖的Python版本和系统Python版本不一致的情况。同时又因系统底层需调用当前版本Python,所以不能随意变更当前系统Python版本。如此情境下就会有Python多版本共存的情况。于是,Python多环境管理工具应运而生。Pyenv和Virtualenv均为Python管理工具,不同的是,Pyenv是对python的版本进行管理,实现不同版本之间的切换和使用;而Virtualenv则通过创建虚拟环境,实现与系统环境以及其他python环境的隔离,避免相互干扰。
子润先生
2021/07/07
4800
Python-包管理器
一般我们都是使用pip安装三方库,用起来很方便。但是所有项目的依赖都在一个环境中。
码客说
2021/11/30
2K0
Python-包管理器
Centos 7.4 多版本Python以及虚拟环境安装
本人前端不太懂 Centos 上面的东西,这两天在搞阿里云的 Ecs 在上面安装 Python 环境,刚开始直接在官网下载了源码包编译安装了 Python3.7.4。但其实部署项目的时候大多会涉及到多项目以及 Python 的版本、环境不同,所以可以多版本 Python + 虚拟环境。
拾贰
2019/08/28
7930
Centos 7.4 多版本Python以及虚拟环境安装
相关推荐
Linux环境下的 pyenv的安装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档