介绍

学习使用pyenv在本地安装多个 Python 版本,这样既不影响工作,也不影响生活~

pyenv 可让你轻松地在多个 Python 版本之间切换。它简单、不引人注目,并且遵循 UNIX 的单一职责的传统,可以很好地完成一件事。

安装 pyenv

  1. 在 mac 上,使用brew
  1. $ brew install pyenv
  1. 在 shell 中配置 pyenv 的初始化
  1. $ echo 'eval "$(pyenv init --path)"' >> ~/.zprofile

更多安装方式见官网安装文档

pyenv 常用命令

查看所有可安装的 Python 版本

  1. $ pyenv install -list
  2. Available versions:
  3. 2.1.3
  4. 2.2.3
  5. 2.3.7
  6. 2.4.0
  7. 2.4.1
  8. 2.4.2
  9. ...
  10. 3.9.1
  11. 3.9.2
  12. 3.9.3
  13. 3.9.4
  14. 3.9.5
  15. 3.10.0b2
  16. 3.10-dev
  17. 3.11-dev

查看已安装的 Python 版本

  1. $ pyenv versions
  2. system
  3. * 3.7.10 (set by /Users/zioyi/.pyenv/version)

安装指定 Python 版本

  1. $ pyenv install 3.10.0b2
  2. Downloading 3.10.0b2...
  3. -> https://downloads.python.org/3.10.0b2.tar.bz2
  4. Installing 3.10.0b2...
  5. Installed 3.10.0b2 to /Users/zioyi/.pyenv/versions/3.10.0b2

全局环境指定 Python 版本

  1. $ pyenv global 3.10.0b2
  2. $ python
  3. Python 3.10.0b2 (default, Jul 29 2021, 09:57:10) [Clang 12.0.5 (clang-1205.0.22.9)] on darwin
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>>

当前 shell 下指定 Python 版本

  1. $ pyenv local 3.7.10
  2. $ python
  3. Python 3.7.10 (default, Jul 29 2021, 09:57:10) [Clang 12.0.5 (clang-1205.0.22.9)] on darwin
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>>

备注:local 的优先级高于 global,后面的原理以后讲到

卸载已安装的 Python 版本

  1. $ pyenv uninstall pypy3.7-7.3.5
  2. pyenv: remove /Users/zioyi/.pyenv/versions/pypy3.7-7.3.5? [y|N]y
  3. pyenv: pypy3.7-7.3.5 uninstalled

更多用法见官网命令手册

pyenv 的原理

实际上, pyenv 的秘密就藏在安装 pyenv部分的第二步:初始化 pyenv

  1. eval "$(pyenv init -)"

因为这行命令写在.zprofile文件中,所以在每次登录 shell ,都会去执行,它的效果是在PATH中加入 pyenv 相关的路径

  1. $ echo $PATH
  2. ***:/Users/zioyi/.pyenv/shims:/Users/zioyi/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:***

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

系统默认的 Python 一般是在/usr/bin目录下面,而 pyenv 的路径/Users/zioyi/.pyenv/shims在其之前,所有当我们在 shell 中去执行 Python 命令时,会现在 pyenv 的目录里去找

  1. $ which python
  2. /Users/zioyi/.pyenv/shims/python

我们将 shim 称作垫片,它就像是 shell 和 Python 之间的一层代理,pyenv 在 ~/.pyenv/shims 目录下创建了各种 Python 版本相关命令的垫片

  1. $ ls ~/.pyenv/shims
  2. 2to3 flask jupyter-bundlerextension jupyter-troubleshoot pycodestyle pytest-bdd python3.7-gdb.py rst2odt_prepstyles.py
  3. 2to3-3.10 idle jupyter-console jupyter-trust pydoc pytest-benchmark python3.7m rst2pseudoxml.py
  4. 2to3-3.7 idle3 jupyter-kernel libpypy3-c.dylib pydoc3 python python3.7m-config rst2s5.py
  5. __pycache__ idle3.10 jupyter-kernelspec mako-render pydoc3.10 python-config pyvenv rst2xetex.py
  6. coverage idle3.7 jupyter-migrate pep8 pydoc3.7 python3 pyvenv-3.7 rst2xml.py
  7. coverage-3.7 iptest jupyter-nbconvert pip pyflakes python3-config rst2html.py rstpep2html.py
  8. coverage3 iptest3 jupyter-nbextension pip3 pygmentize python3.10 rst2html4.py send2trash
  9. cpuinfo ipython jupyter-notebook pip3.10 pypy python3.10-config rst2html5.py
  10. easy_install ipython3 jupyter-qtconsole pip3.7 pypy3 python3.10-gdb.py rst2latex.py
  11. easy_install-3.7 jsonschema jupyter-run py.test pypy3.7 python3.7 rst2man.py
  12. flake8 jupyter jupyter-serverextension py.test-benchmark pytest python3.7-config rst2odt.py

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

  1. $ cat ~/.pyenv/shims/python
  2. #!/usr/bin/env bash
  3. set -e
  4. [ -n "$PYENV_DEBUG" ] && set -x
  5. program="${0##*/}"
  6. export PYENV_ROOT="/Users/zioyi/.pyenv"
  7. exec "/usr/local/opt/pyenv/bin/pyenv" exec "$program" "$@"

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

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

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

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

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

  1. exec -a program "$path" "param1" "param2"
  2. # 注:即执行 "path" "param1" "param2",并使用 program 作为程序名,程序名即 shell 中的 $0,python 中的 sys.argv0

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

  1. exec -a python ~/.pyenv/versions/3.10.0b2/bin/python -V

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

总结

pyenv 可以很好的帮助我们管理 Python 的多版本问题。当不同的工程项目所需的 Python 版本不同时,可以通过 pyenv 来方便管理;当我们想尝鲜 Python3.10 而又担心污染开发环境时,也可以使用 pyenv。

管理 Python 多版本,pyenv 用起来的更多相关文章

  1. python编程【环境篇】- 如何优雅的管理python的版本

    简介 之前的文章(Python2还是python3 )中我们提到,建议现在大家都采用python3,因为python2在今年年底将不在维护.但在实际的开发和使用python过程中,我们避免不了还得用到 ...

  2. 用pyenv管理Python多版本及下载加速方法--Mac上

    原文:https://www.jianshu.com/p/91fc7ecc5e46 先大致介绍下pyenv的安装及配置流程.随后介绍加速下载方法 安装: brew install pyenv 配置 在 ...

  3. pyenv管理python版本

    一.介绍 pyenv 是 Python 版本管理工具. pyenv 可以改变全局的 Python 版本,安装多个版本的 Python, 设置目录级别的 Python 版本,还能创建和管理 virtua ...

  4. Mac OS下使用pyenv管理Python版本

    问题的由来 在开发过程中,可能会遇到多个版本同时部署的情况. Mac OS自带的Python版本是2.x,自己开发需要Python3.x 系统自带的是2.6.x,开发环境是2.7.x 由于Mac机器系 ...

  5. 使用 pyenv 管理 Python 版本

    http://einverne.github.io/post/2017/04/pyenv.html   Posted on 04/22/2017 by Ein Verne | View revisio ...

  6. python多版本以及各种包管理

    python多版本以及各种包管理 python 包管理 各个版本 python版本管理 由于Python有2.x和3.x两个大的版本,而且每一个工程建立所用的各种包的版本也不尽相同(如flask1.x ...

  7. 使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境

    在上一篇博客中,我介绍了如何在ubutnu 18.04中安装pyenv.这一次我将介绍如何使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境. 0.相关命令 首先使用pye ...

  8. 使用pyenv来管理python版本

    使用pyenv可以很方便的切换python版本,而不会影响系统的python版本,对需要使用supervisor(仅支持python2)托管程序,项目使用python3开发的情况十分有用 pyenv的 ...

  9. Python linux 上的管理工具 pyenv 安装, pip 使用, python项目(版本分割, 项目分割, 虚拟环境创建)

    01: 假设你有一个最小环境安装的 centos-6.x 的linux操作系统 02: 安装 git => yum -y install git 03: 安装依赖 => yum -y in ...

随机推荐

  1. 前端开发入门到进阶第一集【使用sublime快速编写Html和Css】

    1,安装sublime编辑器,下载地址:http://www.sublimetext.com/3 2,要使用sublime的插件机制必须安装package control:https://packag ...

  2. 为什么要配置java环境变量

    Java环境变量,真的还有必要配吗? 作为年龄上堪称老鸟而技术上却是菜鸟的老菜鸟,为了祖国的编程事业,不惜拿出一个月工资,淘了一台配置稍高的二手笔记本,打算与老笔记本中的撸啊撸片彻底说再见,誓要在新机 ...

  3. Git的使用(六)

    前言 版本管理工具总结: 开发团队项目,对项目的版本进行管理. 使用过的版本管理工具: TFS.SVN与Git. TFS:管理项目,通过visual Studio管理源码,拉取分支,提交代码等.也可以 ...

  4. 【小工具系列】Python + OpenCV 图片序列转换成视频

    图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...

  5. YGC问题排查

    在高并发下, Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大. 不管是 「GC频率过快」还是「GC耗时太长」,由于GC期间都存在Stop The World问题,因此很容易导 ...

  6. noip模拟31[time·game·cover]

    noip模拟31 solutions 我就觉得这些考试题是越考越难,我是也越考越完蛋,已经完完全全的接近爆零了 只有20pts,说真的这还是我第一次挂掉30pts,本来我还有50pts嘞 所以这次考试 ...

  7. django有什么CMS比较好用?哪个好?

    这个网站有目前在电子商务领域流行的django cms的横向对比表格,可以看看 https://djangopackages.org/grids/g/ecommerce/ 从结果上来看,django- ...

  8. 90%的开发者都不知道的UI本质原理和优化方式

    前言 很多开发者在工作中一直和UI打交道,所以认为UI非常的简单! 事实上对于90%的开发者来说,不知道UI的本质原理. 虽然在开发中,我们在接到产品的UI需求之后,可以走捷径照抄大型APP代码,但是 ...

  9. 三、Linux部署MinIO分布式集群

    MinIO的官方网站非常详细,以下只是本人学习过程的整理 一.MinIO的基本概念 二.Windows安装与简单使用MinIO 三.Linux部署MinIO分布式集群 四.C#简单操作MinIO 一. ...

  10. Crash course statistics

    Crash course statistics 01什么是统计学 描述性统计(Descriptive statistics) 推理统计可以得出之外的,基于"样本"的推论统计学来估计 ...