Python-Vers Management

Foreword

设想 –> 场景一:A 项目是一个爬虫项目,需要用到 requests、pyspider、scrapy 等包或框架;B 项目是一个 GUI 界面项目,需要用到 GUI 相关的包或库;这需要把所有用到的包安装到原生 Python 环境中,开发环境越来越臃肿。场景二:C 项目是一个 Python2.x 项目;D 项目是一个 Python3.x;两项目要求的 Python 版本不兼容。怎么办?!!

前面提到过一个系统中是可以同时存在多个 Python 版本的,它可以完美的解决上述问题,但是你需要注意新添加的 Python 环境对系统既有环境的影响,这就涉及到系统中 多个 Python 版本的管理 问题。

更多 Python 版本管理以及运行环境相关内容,请关注博主相关博文系列:

之一 >>> Python-Vers Management

之二 >>> Pythoner 神器之 virtualenv

之三 >>> 一文了解数据科学神器 Anaconda

之四 >>> Jupyter Tutorial


Python-Vers Introduction

目前,Python 有两个主流的版本:

分别为:2.x 版本3.x 版本

Python 3.0 是一次重大的升级,为了避免引入历史包袱,Python 3.0 没有考虑与 Python 2.x 的兼容(不完全兼容),这也就导致很长时间以来,将现有应用从 Python 2.x 迁移到 Python 3.x 是一项不小的挑战。

虽说有 2to3 之类的转换工具可以进行代码的自动转换,但无法保证转换后的代码 100% 正确。而且,如果不做人工修改的话,转换后的代码性能可能还不如转换前。故很多 Python 2.x 的用户不愿意升级到 Python 3.0。

2.x & 3.x 版本的不兼容,引发如下问题:

我们给出一种实际情况 >>>> 原生 Unix/Linux 系统已经自带有一个版本的 Python2,但它不是我们需要的 Python 版本,我们想要编译安装满足我们期待的 Python 版本(Python3)。

此时,我们将面临一种选择:是在原有版本基础上 Update(2.x –> 3.x) 呢?还是去 Setup 一个新版本的 Python(原生版本 Python 也保留)?

Update 存在的问题 >>>>

事实上,由于 Python 2.x 和 Python 3.x 兼容性问题,将 Python 2.x 直接升级到 Python 3.x 会产生一些问题(例如:Centos 系统下的很多工具(yum、iotop 等)都依赖原生 Python 2.x 版本),直接升级后会导致无法使用。

Solution >>>>

所以,一般建议安装添加一个新版本的 Python(与系统原生 Python 版本共存),或者使用虚拟环境管理工具(Virtual Envs Tools)进行多版本管理(这里不用深究,Virtual Envs Tools 是一种优秀的 Python 多版本共存管理方案)。


多版本共存管理方案

正如博文前言场景二中所描述,实际 Python 开发过程中,多 Python 版本开发环境是我们必然要面对的问题。

关键在于:如何保证多个 Python 版本安装、配置以及使用之间互相不产生影响呢?

这就是当前小节讨论的内容,这里会对网络上主流的几种方案进行试验、分析。你可以根据自身情况选择一个适合开发场景的解决 Python 多版本共存冲突问题的解决方案。


一个简单、快捷的解决多版本冲突问题的方案 >>>> 构建软链接

核心思想 >>>> 在系统原生 Python 版本的基础上,再安装(Add)一个新的期望版本的 Python 环境,且保证新安装 Python 不会影响原生环境,以实现期望版本和原生版本完美共存。

For Unix & Linux Platform

实际上,在介绍 Unix & Linux 平台下安装 Python 时,已经给出了具体的解决方法:

1 –> 源码编译安装

注意在使用源码安装过程中,不要勾选有关自动添加环境变量的选项(默认不勾选),安装成功后手动设置即可,否则会影响原生环境。

安装步骤见前面系列博文,这里不再赘述。

2 –> 构建软链接

Unix && Linux 下可以通过构建多个带有不同版本标识的 Python 软链接:

注意,为了避免不小心覆盖掉系统中原生的 Python 软链接,如:/usr/local/bin/pythonX/usr/bin/pythonX,构建前最好先查询一下。

1
2
3
4
5
6
7
8
9
10
# 产生软连接时要注意系统中已存在的 Python 软链接,防止原生 Python 调用被覆盖掉!!!
# 查看系统中所有既存的 python 链接信息:
$ ll /usr/local/bin | grep "python*"

# 确认 `/usr/local/bin` 下没有 `python3.5 && python2.7` 软链接,再进行构建:
#
# python 3.5 symbolic link
$ ln -s /usr/local/python3.5/bin/python3.5 /usr/local/bin/python3.5
# python 2.7 symbolic link
$ ln -s /usr/local/python2.7/bin/python2.7 /usr/local/bin/python2.7

创建软链接后,在使用 Python 时,我们就可以通过特定软链接启动相应版本的 Python 解释器了:

1
2
3
4
5
6
7
8
# 启动系统原生环境:
python

# 启动 python2.7 环境:
python2.7

# 启动 python3.5 环境:
python3.5

For Windows Platform

那么 Windows 下如何实现呢???Windows 下是通过设置环境变量来达成的。

1 –> 二进制包安装

注意在使用二进制包安装过程中,不要勾选有关自动添加环境变量的选项(默认不勾选),安装成功后手动设置即可,否则会影响原生环境。

安装步骤见前面系列博文,这里不再赘述。

2 –> 配置系统环境变量

推荐修改系统环境变量(PATH)中设置的 Python 安装目录路径即可,想用那个版本就指向那个版本。

思考:可能有些同学会将多个 Python 安装目录同时添加到系统的环境变量中,以期待可以同时使用多个版本的 Python。这是有问题的,系统搜索程序或可执行文件的路径($PATH)是具有优先级的!,路径在系统 PATH 变量中设置(位置)越靠前,越先被检索到使用。

================================================

至此,我们就可以在当前系统中同时存在多个 Python 版本供我们选择使用!

使用软链接 实现多版本冲突问题存在一定的缺陷:

  1. 不进行特殊安装、配置记录的话,一段时间后,容易引发系统中的 Python 版本管理混乱;
  2. Windows 下各版本 Python 环境切换繁琐,并且极易发生库管理混乱问题;
  3. 需要开发人员手动进行 Python 版本的管理,很繁琐。

那有没有更好的 Python 多版本共存的解决方案???

答案肯定是有的!!!


Virtual Envs Tools(Recommended)

除了上述给出的方法外,虚拟环境管理工具 是一种完美解决 Python 的多版本共存问题的最优解决方案。

什么是虚拟管理工具?

Python 的正式学习之后,相信你肯定会对 “Python 实现其强大功能的前提,就是它具有数量庞大且功能相对完善的标准库和第三方库。通过对库的引用,能够快速实现对不同领域业务的开发。” 有比较深入的理解。

1 –> 为什么引入虚拟环境管理工具?

引入虚拟环境管理工具 –> 可以帮助你完美解决:

  1. 不同学习、开发项目对 Python 环境的要求不同(可能使用 Python2.x,可能使用 Python3.x);
  2. 配合包管理工具(Pip),管理以及维护 Python 中数量庞大的标准库和第三方库,这是复杂也是重要的!

2 –> 虚拟环境管理工具可以做什么?

  • Virtual Envs Toos 可以创建任意多个虚拟环境(可以看作成一个个容器),使用时指定到(切换到)某一虚拟环境之后 Pip 安装的包、库就只会在这个环境(容器)下;并且各虚拟环境(容器)之间,以及虚拟环境和系统原生环境之间是隔离的(一个个相互独立、隔离的容器)。
  • 假设某一个虚拟环境预计不再使用,可以直接删除掉相应虚拟环境,由于虚拟环境的独立、隔离性,不用关注文件残留、关联问题。

通俗来说,Virtual Envs Toos 可以为每个 Python 项目,甚至每个脚本各自建立一套 “独立、隔离” 的 Python 环境(环境中可以自定义特定的 Python 版本以及特定的依赖库)。NB~~~


virtualenv && conda

这里给出两种用于解决 Python 多版本共存冲突问题的虚拟环境管理工具(神器):

  1. virtualenv
  2. conda

virtualenv & conda 都可以进行虚拟隔离环境管理,但两者之间也存在一定的 区别:

  1. 准确来说,virtualenv 仅仅是虚拟环境管理器,conda 相当于:virtualenv(虚拟隔离环境) + pip(包管理工具),也就是说 conda 同时具有虚拟环境管理和包管理的功能;
  2. 作为包管理器,pip 只能安装 python 的包,而 conda 还可以安装一些不是基于 Python 开发的工具软件,但遗憾的是,相较于 pip,conda 作为包管理器一般且会安装过多依赖。故推荐,在无特殊需求安装应用时,可以先选择使用 pip install packagename 进行安装,如果无法安装的话,再尝试使用 conda install packagename 进行安装。
  3. 作为虚拟环境,conda 虚拟环境是独立与于系统原生 Python 环境的,即无论系统 Python 解释器什么版本(哪怕 2.7),你也可以指定虚拟环境中 Python 版本为 3.6;而 virtualenv 是依赖系统主环境的,只能虚拟安装操作系统中已安装解释器版本的 Python 环境。

事实上,一般不直接使用 virtualenv 和 conda 工具进行 Python 版本管理,而是 选用 virtualenv && conda 的扩展应用 来进行管理 –>

  • virtualenv –> virtualenvwrapper
  • conda –> conda in anaconda(miniconda)

这里是为了以一种更方便、高效、愉悦的方式来使用 virtualenv && conda。

篇幅原因,关于 virtualenv(virtualenvwrapper) && conda(anaconda/miniconda) 的使用方法可见相关系列博文:

之二 >>> Pythoner 神器之 virtualenv

之三 >>> 一文了解数据科学神器 Anaconda

Python 中的版本管理方法一般 推荐使用 Anaconda ,除了不依赖操作系统级别的 Python 解释器,以及提供了 Python 包管理、虚拟环境功能之外,还包含了 Python 进行数据分析相关的 180+ 的科学包及其依赖项,你可以将其理解为一个 Python 的开发生态圈。


Author

Waldeinsamkeit

Posted on

2018-01-02

Updated on

2023-11-16

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.