简介


之前的文章(Python2还是python3 )中我们提到,建议现在大家都采用python3,因为python2在今年年底将不在维护。但在实际的开发和使用python过程中,我们避免不了还得用到python2,如何让python2和python3共存?之前网上很多教程很多是让配置一个默认的python,然后再配置一个python2,这样输入python调用的是python3,输入python2调用的python2。这样做也可以使用,但是还不够优雅,因为牵扯到很多环境变量的配置。

于是就有人参考ruby的版本管理工具rbenv,开发了可以管理python版本的工具:pyenv。 需要提前说明,pyenv只能用在mac/linux系统使用(本文主要也是基于mac来介绍的),windows系统需要用到另外的工具,文章的最后会做介绍。

pyenv的使用


原理

相信大家都对系统的环境变量PATH比较熟悉,mac通常用:分隔路径(windows是用;分隔)比如:/usr/local/bin:/usr/bin:/bin。当我们在命令行输入某一个命令,比如:python或者pip,系统会去我们配置的环境变量中从左向右依次查找对应的命令,因此排在前面的路径优先级会更高。

pyenv正是利用了这一特性,当用户使用python相关命令时,pyenv会拦截到这一过程,然后将自己管理的python版本的shim目录插入到PATH 中/usr/local/bin:/usr/bin:/bin最前面,这样,当系统去查找python等命令时,就会优先查找pyenv设置的目录,从而达到可以灵活切换python版本的目的。

想了解pyenv实现的同学,可以直接去github上查看其源码及更详细的介绍文档。

安装

pyenv提供了三种方式来安装,这里推荐使用pyenv-installer来安装,因为足够简单,同时还会安装一些比较实用的工具插件:

  • pyenv-doctor  (用于检测pyenv的环境)
  • pyenv-installer
  • pyenv-update   (用于更新)
  • pyenv-virtualenv (用于区分依赖库的不同版本,后面会介绍)
  • pyenv-which-ext  

安装命令如下:

$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

  # the following to ~/.zshrc:

  export PATH="/Users/xuanke/.pyenv/bin:$PATH"

  eval "$(pyenv init -)"

  eval "$(pyenv virtualenv-init -)"

命令执行完后,没有报错就是安装完成了,不过会提示你需要配置pyenv的环境变量(如上面所示)。其中pyenv init命令是将pyenv的shim目录添加到PATH中。我们可以验证下,修改完.zshrc之后,执行source ~/.zshrc让配置生效,然后我们打印环境变量PATH,如下:

从上图可以看出,pyenv的配置已经被插入到/usr/local/bin:/usr/bin:/bin的前面。

更新

使用pyenv update命令,可对pyenv直接进行升级。

卸载

这里要分两种场景:1)暂时不想用pyenv,但是不想删除。 2)彻底删除。

针对第一种情况,仅仅需要将pyenv init的配置从~/.zshrc中移除,这样就不会将pyenv的shim目录添加到PATH的前面。

针对第二种情况,可以通过删除pyenv实现,命令如下:

# . 删除pyenv的安装目录
$ rm -rf $(pyenv root) # . 删除在~/.zshrc中配置的pyenv环境变量

pyenv主要命令

我们可以执行pyenv -h查看pyenv的主要命令:

pyenv install

pyenv install用于安装对应的python包,同时加上--list参数,可以用来查看可以安装的包列表。

然后用pyenv install + 版本号,就可以安装对应版本的python。

需要注意,有时候需要安装python Framework,则需要使用下面的命令:

PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.

pyenv uninstall

用于卸载本地已经安装的python版本

将versions目录下面的对应版本的包删除掉。

pyenv versions

查看本地已经安装可用的python版本,其中前面标*的,是本地当前版本。

pyenv version

用于查看本地当前设置的python版本

python 版本切换

pyenv的版本主要有三个维度:shell、项目目录、全局(global),它们三者的优先级依次降低,即如果设置了shell,又设置了全局的,那么以shell配置的python版本为主。接下来我们看看这三种维度下怎么修改python版本。

如果想要修改全局的python版本,那么可以使用python global pythonVersion,该命令会同步在pyenv的根目录(默认是~/.pyenv/)下创建一个version的文件,文件内容是要切换的python版本号,如下所示:

如果你的某个项目需要特定的python版本,也是可以实现的。可以使用python local pythonVersion,该命令会同步在项目目录下,创建一个.python-version的文件,文件内容是切换的版本号,如下所示:

如果你只希望临时对shell的python版本做变更,可以使用python shell pythonVersion, 该命令会同步在当前的shell窗口创建一个PYENV_VERSION的环境变量,如下图所示。如果重启了shell窗口,或者新建一个shell窗口,则PYENV_VERSION不起作用,也就是其作用域仅仅在当前的shell。如果想取消shell级别的python环境,可以执行命令:unset PYENV_VERSION

我们再来验证下三者的优先级,我们将全局的python版本设置为3.7.4,然后将shell的python版本设置为2.7.16,然后执行pyenv version,如下所示:

从上面的结果可以证明,shell的优先级是要高于全局的。

在windows上使用pyenv

pyenv并没有直接支持windows版本,但是通过pyenv-win项目来支持windows的使用,我们可以通过pip或者直接从github将pyenv-win的代码下载到本地用户目录,一般是:%USERPROFILE%/.pyenv。然后可以将%USERPROFILE%\.pyenv\pyenv-win\bin;%USERPROFILE%\.pyenv\pyenv-win\shims 配置到环境变量PATH的最前面,然后重启命令行窗口,执行:pyenv --version 命令查看pyenv配置是否成功。

pyenv在windows上的使用和mac上类似,因为我没有在windows上对pyenv的命令逐条尝试,所以这里我贴一个github上面的命令使用说明:

一个项目需要多套环境


还有一种场景,假如我们有一个项目,但是这个项目却需要对应两个python环境,这两个环境对应的依赖包肯定是不一样的,这应该怎么办呢?貌似直接通过pyenv没办法实现。 其实上面已经提到过,pyenv提供了一个插件工具pyenv-virtualenv,这个工具可以帮我们实现环境的分离。它的使用方法如下:

$ pyenv virtualenv pythonVersion  projectName

其中pythonVersion对应的是python的版本号,projectName对应的是项目的名称(可以带上python版本的标识),比如我们现在有个pythonDemo的项目,我们为他基于python2.x和python3.x创建两套依赖库环境:

从上面我们可以看出,虚拟环境被创建在了pyenv/versions/version/envs目录下。

创建完成后,我们可以通过pyenv virtualenvs查看已经创建的虚拟环境。

之后我们可以通过pyenv activate projectName(比如:pythonDemo_2.7.16) 来切换项目对应的虚拟环境。通过pyenv deactivate来退出虚拟环境。

总结


上面是pyenv的常用的介绍,相信已经可以帮助大家来比较方便的管理python版本,希望大家在之后的工作中能立即使用起来,这样才能将pyenv消化掉,告别依靠各种配置环境变量来管理python版本的方式。

python编程【环境篇】- 如何优雅的管理python的版本的更多相关文章

  1. vim配置python编程环境及YouCompleteMe的安装教程

    python号称人工智能语言,现在可算大热,这篇博客将介绍如何用vim打造一款自己专属的python编程环境. step1 由于安装YouCompleteMe需要vim8.0及以上版本,所以得安装使用 ...

  2. Emacs 配置 Python 编程环境

    python编程环境设置涉及到:自动完成.语法检查.虚拟环境. 为了不把系统搞乱,在python的虚拟环境中安装相关的插件. 一.安装python虚拟环境 virtualenvwrapper sudo ...

  3. 用10分钟,搭建图像处理编程环境,0失败!(python语言,windows系统)

    以前,你可能看过很多的文章,开始搭建一个图像处理的编程环境. 结果,按照教程一步一步做的时候,总是出现各种各样的问题. 就算成功了,后续开发过程中要用到不同版本的opencv,不同版本python,更 ...

  4. 使用UE配置Python编程环境

    一直在使用UE来进行python编程,觉得在UE下进行python编程使用起来还是很方便地,现在特来总结一下: 1.首先是python环境搭建 (1)下载python2.7 https://www.p ...

  5. Spark 的 python 编程环境

    Spark 可以独立安装使用,也可以和 Hadoop 一起安装使用.在安装 Spark 之前,首先确保你的电脑上已经安装了 Java 8 或者更高的版本. Spark 安装 访问Spark 下载页面, ...

  6. 在win10的Linux子系统(WSL)上搭载python编程环境

    为什么使用WSL进行python编程 WSL,全称Windows Subsystem for Linux.简言之,win10提供了一个子Linux系统,可以解决虚拟机和双系统的系统之间阻隔的问题而不影 ...

  7. Python编程环境设置

    第1节.Python编程环境设置 一.sublime相关 1.sublime REPL插件安装 (1)安装 先打开插件安装面板:ctrl+shift+P 输入install ,选择Package Co ...

  8. [零基础学pythyon]安装python编程环境

    不论什么高级语言都是须要一个自己的编程环境的,这就好比写字一样,须要有纸和笔,在计算机上写东西.也须要有文字处理软件,比方各种名称的OFFICE.笔和纸以及office软件,就是写东西的硬件或软件.总 ...

  9. ubuntu 16.04下如何打造 sublime python编程环境

    一.安装python3     ubuntu自身是安装python2的,例如在ubuntu 16.04中安装的就是python2.7.但我想在python3的环境下进行开发所以就要安装python3. ...

随机推荐

  1. Swoole4-swoole创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...

  2. 浅析MVC Pattern

    一.前言 最近做CAD插件相关的工作,用到了一些模式,解决对应场景的问题. 比如插件的运行实例上使用Singleton.实例内部使用了MVC(Strategy and Observer ). 针对CA ...

  3. 网页布局——Box盒子

    在移动端开发的时候,圣杯布局,弹性盒,是我们经常会用得到的,W3C很久以前就有一个display:box属性 flex是最新的,但是在实际的浏览器测试中,display: flex 不能完全替代dis ...

  4. 我最推荐的一张Java后端学习路线图,Java工程师必备

    前言 学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把. 今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点.所谓不求最好,但求最全,学习Java后端的同学 ...

  5. 从实践角度重新理解BIO和NIO

    前言 这段时间自己在看一些Java中BIO和NIO之类的东西,看了很多博客,发现各种关于NIO的概念说的天花乱坠头头是道,可以说是非常的完整,但是整个看下来之后,自己对NIO还是一知半解的状态,所以这 ...

  6. 初学 Spring MVC(基于 Spring in Action)

    Spring MVC(Model-View-Controller) 当你看到本博文时,我猜你可能正面临着我已探索过的问题. 同其他博主一样,我先按照书上详细的介绍一下 Spring MVC,也是为了自 ...

  7. 单调队列与DP

    算是一个总结吧! 先来一个模板: TYVJ 1305 最大子序和 题目描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m ...

  8. RAW网络编程

    LWIP提供了三种的可以被应用程序直接调用的接口API: (1)       低水平的,基于内核/回调函数的API(后面称 RAW API)    适用于数据量不大,没有os的MCU (2)      ...

  9. spring cloud 优雅停机

    spring cloud 优雅停机 大部分部署项目如果要停掉项目一般都是用kill -9 来杀进程 但是由于Eureka采用心跳的机制来上下线服务,会导致服务消费者调用已经kill的服务提供者然后出错 ...

  10. Linux及Windows安装Redis(详细)

    Linux及Windows安装Redis 1.Windows安装教程 1.1下载 https://github.com/MSOpenTech/redis/releases 进入github里下载red ...