Pyenv

简介

  • 首先,该工具是在类linux环境中的工具,在windows系统下是不支持的。(tips: win10现在支持linux子系统利用WSL,可以非常方便在windows上使用linux系统,自行google)

  • 然后,工具主要作用是解决一个比较棘手的问题,就是多个python版本的使用。无论是pytho2还是python3包括多个版本之间的使用上。试想下,同一系统环境中,多个项目使用的不同的python版本,那么在启动项目时,使用的python版本的指定就成了必须明确指定,且不同版本所使用的第三方包管理工具的版本也需要明确指定使用。

    因此,要解决这种繁琐的操作,pyenv由此诞生,其就借鉴了Ruby的多版本环境下的管理模式。既然是一种模式,那就套用这种模式。模式设计描述大致如下:

    1. 利用shell启动加载,初始化工具。
    2. 利用linux系统的三大作用域,system wild/user's home/project_or_instance directory ,也就是 系统作用域(在apphome目录)/用户作用域(shell 环境变量)/ 单个项目或者叫实例目录(目录下的.python-version文件中描述)/ 。
    3. 一切python及其官方自带工具或脚本,运行都会隐晦的通过pyenv调用,使用者无感知。原理如下条:
    4. pyenv的命令操作,就是依据三层. 首先是一个环境变量PYENV_VERSION(通过pyenv shell管理它),优先级第一;然后是每个app或者project目录下的.python-version(通过pyenv local管理它,没有则从当前目录向上找,直到找到根目录)。最后是系统层面,就是pyenv_root/version文件,系统层面的文件时放在pyenv安装目录的(一般是~/.pyenv/)。如果连version中都没有,那么就依据无pipenv状态下的python执行。
    5. 依据上面规则,依次排查判断,以此最终确定本次执行的命令是确定的python版本。
  • 小结: 其实说白了,就是基于path查找命令优先级为基础,强行在path前面插入一个pyenv_root/shims的目录(里面有伪造的python/pip/setuptools等命令的同名脚本,有兴趣可以看下脚本内容)。然后执行这些伪造命令,其实都是在执行pyenv命令,这些伪造的命令会作为参数传递给pyenv命令,然后执行pyenv命令。然后pyenv命令,根据当前shell所在的上下文(也就是依据三层判定规则),决定出使用哪个版本的python和伪造的参数名同名的命令,来具体执行。而python版本需要通过pyenv install安装到pyenv_root/version/目录下,这样才能找到最能匹配的版本。这里最重要的一点其实就是上下文环境了,根据上下文环境确定出正确的version版本,这个version版本而且不是某一个确定的,还可以是一个优先级顺序列表。如: 3.7.0 3.5.6 2.7 ...

博文图片挂了临时解决办法

安装pyenv

  • 前提,只能在类linux系统中使用
  • 安装,执行命令:curl https://pyenv.run | bash
  • 配置, 根据提示,在~/.bashrc文件最后,追加以下shell命令:
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
  • 断开shell会话,再连接一个,使新添加export命令加载生效。

  • 就可以开始使用pyenv

  • 安装过程参考

通过pyenv安装python各种发行版

  • 首先,pyenv是将现有支持的python各python发行版版本信息保存到pyenv本地的。如果发现没有自己的版本可以先通过命令更新本地信息,已达到支持当前版本需求。具体操作参看下面的常用命令。
  • 然后,通过pyenv install --list|grep 出自己想要的版本。如:pyenv install --list|grep 3.7.0
  • 其次,要知道pyenv安装python也是通过一个叫做pyenv-build的pyenv插件完成的。对pyenv-build感兴趣点击click me, pyenv-build pyenv-build 也是可以单独执行使用的命令。
  • 再,通过pyenv安装过程如下:



    可以看到,是从pyenv也是官方网站下载编译安装的。warning提示的是害怕通过pyenv安装的python会使用提示的文件中的配置,从而影响新安装的python使用其中的配置,脱离了pyenv对python版本的管理目的。

    Tips: 新手要明确一个概念,使用pyenv时是从python发行版的官网新安装的,和现有系统中的python版本没有一点关系,当前系统的旧版本依然好好的呆在它原来的位置。有了pyenv,系统有的旧版本被pyenv当作system版本来看待。pyenv安装的新版本都是放在了~/.pyenv/versions/目录下的。pyenv根据其设计原理就使用versions目录下的正确版本了。
  • 最后,pyenv安装python就没有了神秘感;不过需要注意的是NOTICE:通过pyenv安装python,还是要根据不同环境需要提前安装依赖的,安装依赖查看pyenv安装python依赖

pyenv命令

参考连接

常用命令

  1. pyenv commands 查看所有子命令
  2. pyenv install --list 查看所有可安装的python发行版
  3. 更新可用python发行版,执行命令: cd /root/.pyenv/plugins/python-build/../.. && git pull && cd -
  4. pyenv install 3.7.1 安装指定的发行版,这里举例是安装3.7.1
  5. pyenv version 根据上下文,打印出当前环境下使用的python 版本。其中如果打印的是"system (set by /root/.pyenv/version)",表示pyenv没有获取到应该使用的版本,就会使用原系统path中的python。
  6. pyenv versions 展示当前pyenv可用的python版本,前面有星号的表示当前上下文下会使用的python版本。如图示:有两个版本,system代表系统的,非pyenv安装的版本;而3.7.0就是我通过pyenv install 3.7.0 安装的版本。

  7. pyenv which python3.7 获取which后面指定的命令的full path,经常用到的自省命令。
  8. pyenv whence 2to3 列出指定命令在哪些版本中存在,也是经常用到的自省命令。
  9. pyenv local 3.7.0 在当前目录下,设置当前目录的使用python版本。设置是记录在当前目录下一个.python-version的文件中,该文件由pyenv local 自动生成。



    可以看到操作后,在hello目录环境下,再执行pyenv version 可以看出python版本使用的是3.7.0了。前后对比可以看出pyenv对python版本管理的效果。

    除此之外,local后面还可以设置多个版本,版本间以空格间隔,多个版本间的顺序依次降低优先级。也就是现在前面的版本中查找,然后再后面的版本中查找。非常兼容使用tox运行py2和py3杂合的项目。
  10. pyenv local --unset 删除当前目录下local环境,即删除了.python-version文件
  11. pyenv global 3.7.0 设置3.7.0 为全局版本,信息写入到pyenv目录下的version文件中;如果该命令后没有跟python发行版本这是返回当前全局版本。
  12. pyenv shell 3.7.0 设置当前会话PYENV_VERSION环境变量为3.7.0;如果不跟版本则打印当前PYENV_VERSION的版本。
  13. pyenv uninstall version 卸载某个版本的python
  14. pyenv rehash 安装新版本后执行,使生效.

多版本Python的管理

使用pyenv就要通过pyenv来安装python版本了

安装示例:

  • pyenv install 3.7.0
  • 新建项目,在项目目录下设置项目使用的python版本:
    • mkdir new_project
    • cd new_project
    • pyenv local 3.7.0
  • 这样在new_project 目录下使用python的其他命令,如pipenv或者pip等都是使用3.7.0版本python对应的版本工具了。
  • 再new_project 目录下使用pip安装django
    • pip install django
    • pip freeze > requirements.txt 生成requirments.txt文件
  • 如果再使用某个命令上有什么疑问,使用pyenv which +命令名 查看当前环境下使用的命令是不是对应的版本下的。特别是通过pyenv安装的python3.7 没有pipenv命令,有时候就使用了system下的,导致使用了错误版本非3.7版本的pipenv初始化项目了。所以所使用pyenv which来确定命令是否使用正确的版本。

小结: 上面也提到了,使用pipenv。其实pyenv + pipenv 的结合使用,是非常棒的一个组合。前者进行python版本管理和切换,后者对python依赖包及独立虚拟环境的管理。具体pipenv的使用介绍查看另一篇文章。这里要特别注意,在使用pipenv install 时要指定--python版本与 pyenv version一致,因为pipenv 是不会自动使用pyenv_root/shims中命令的。

Pyenv常见问题Wiki

pyenv-wiki

你应该学会的Python多版本管理工具Pyenv的更多相关文章

  1. Ubuntu中python多版本管理工具-pyenv

    ubuntu系统版本:16.04 # lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubu ...

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

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

  3. Python切换版本工具pyenv

    目录 安装pyenv 安装与查看py版本 切换py版本 结合ide使用示例 和virtualenv的一些区别 参考文献 使用了一段时间,我发现这玩意根本不是什么神器,简直就是垃圾,安装多版本总是失败, ...

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

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

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

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

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

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

  7. Python多版本管理器-pyenv 介绍及部署记录

    一. pyenv简单介绍 在日常运维中, 经常遇到这样的情况: 系统自带的Python是2.x,而业务部署需要Python 3.x 环境, 此时需要在系统中安装多个Python版本,但又不能影响系统自 ...

  8. centos下python多版本管理(pyenv+python+virtualenv+ipython)

    pyenv是个多版本python管理器,可以同时管理多个python版本共存,如pypy,miniconde等等 1 环境准备 安装相关软件和pyenv1.1 安装相关软件yum install -y ...

  9. 在Ubuntu 18.04中安装pyenv(Python多版本管理工具)

    最近正在重头梳理Python的基础知识,为了更好地使用Python进行开发,防止发生版本混乱(不同的第三方库有可能因为Python版本不兼容而报错),所以需要使用pyenv进行版本管理. *** 通常 ...

随机推荐

  1. Tensorflow源码解析1 -- 内核架构和源码结构

    1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...

  2. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...

  3. mybatis一对一 和 一对多 嵌套查询

    实际项目中的,接口对外VO  会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋  ,楼栋 下面有 房屋    ,   房屋里面又房间 小区Vo  : districtVo { id: nam ...

  4. Python库的安装

    window下python2.python3安装包的方法 一.在线安装 安装好python.设置好环境变量后,在python安装目录下Script文件夹内会存在pip.exe和easy_install ...

  5. 设计模式(Design Patterns)的简单讲解

    模式的诞生与定义 模式(Pattern)起源于建筑业而非软件业(小本本记下来--) 模式之父--美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士; 模式 : -C ...

  6. Java实现简易联网坦克对战小游戏

    目录 介绍 本项目的Github地址 基础版本 游戏的原理, 图形界面(非重点) 游戏逻辑 网络联机 客户端连接上服务器 定义应用层协议 TankNewMsg TankMoveMsg MissileN ...

  7. Django Admin管理入门

    Django最强大的部分之一是自动管理界面.它从模型中读取元数据,以提供快速,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容.管理员的推荐用途仅限于组织的内部管理工具.它不是用于构建整个 ...

  8. bug生命周期&bug跟踪处理

    一.BUG BUG:软件的缺陷 1.BUG的定义:----与软件测试的目的对应 软件的BUG,狭义概念是指软件程序的漏洞或缺陷,广义概念除此之外还包括测试工程师或用户所发现和提出的软件可改进的细节.或 ...

  9. linux 进程概念

    1,pcb:进程控制块结构体:/usr/src/linux-headers-4.15.0-29/include/linux/sched.h 进程id:系统中每个进程有唯一的id,在c语言中用pid_t ...

  10. Windows下建立FTP服务器站点

    环境 操作系统版本:Win7旗舰版64位系统 1.安装FTP组件 打开或关闭Windows功能,打开过程可能会比较慢,大概3.4分钟: 安装FTP组件.勾选Internet信息服务下的FTP服务器.F ...