一、说明

1.1 linux为什么不升级python版本

2008年python3就发布了,到2020年1月1日python2.7就停止更新了,为什么主流的linux迟迟不去除python2自带python3。

我们经常听说服务器版操作系统为了保证稳定性,对于软件一般都只采用经过时间检验的稳定版本,而不采用最新版本。linux不升级python版本是否也是这个原因呢?

这确实是python2和python3都不使用最新版本的主要原因,但并不是linux迟迟不去除python2自带python3的主要原因。

python2不升级成python3的主要原因是linux系统本身的一些软件是python2所写,在这些软件没改造成python3前都不能去掉python2,强行卸载python2会导致系统崩溃。

比如典型的,yum就是一个python脚本,当使用yum remove python2要卸载python2最终会要卸载yum,而yum受保护在不使用-f情况下是不能卸载的(Error: Trying to remove "yum", which is protected)。

或者我们换句话说,linux自带的python首先的目地并不是给用户用的,而是给自己的系统工具用的。

系统工具并没有最新版本的需求没有python3的需求系统就不装,这就很好理解了。而且反过来,我去升级、改动系统自带的python版本、环境的行为是不受鼓励的,这可能会影响系统的正常运行。

1.2 当我们升级python版本时我们需要关心的问题

一方面系统自带的python并不是为我们用户设计的,另一方面我们需要新版本的python提供的新特性,所以此时我们就有手动安装python的需要。

这里说的手动安装,并不是直接的yum安装,一方面发布到yum源上的版本基本都验证兼容系统上的工具,另一方面发布到yum源上的版本一般都不会是最新。

这里说的手动安装,是手动编译安装。当然并不是手动安装有多难,而是我们知道yum安装python并不会引入新的python环境而是直接覆盖当前的python环境,而手动编译安装由于前面说的不应改动系统现有python环境所以要安装到另外的目录去,亦即会引入新的python环境。

此时我们要关心两个问题:一是新安装的python会不会影响已有python,二是新安装的python使用时会不会受已有python的影响。

这两个问题从使用角度提出的问题又可以转化为这两个技术角度的问题:一是python程序中import包时从哪些目录import,二是pip安装包时会把包安装到哪个目录。

二、python手动编译安装过程

# 以python 3.8,安装到/data/home/opt1/python38为例

# /data/home/opt1软链接到了/opt1,所以后边可能会混杂出现两个目录

# 和常规的编译安装过程一样

# 解压tar -zxf Python-3.8.0.tgz

# 进入目录

cd Python-3.8.0# 预编译

./configure --prefix=/data/home/opt1/python38

# 编译make# 将编译结果复制到/opt1/python38make install

安装完成后,当前两级目录如下:

三、关心问题的解答

3.1 python程序中import包时从哪些目录import

python程序中import包时从sys.path指向的那些目录下import。

默认情况下sys.path[0]是当前被运行python文件所处的目录(当没有被执行文件时为空),其他是当前所使用python命令的../lib/预设置的文件(夹)。

对于用户而言有两个办法修改sys.path,一种方法是python会将环境变量PYTHONPATH(冒号分隔)解析加到sys.path,所以要加入的目录直接在~/.bashrc等文件中赋给PYTHONPATH即可。另外一种方法是sys.path本质就是一个列表,所以可以直接在python代码中使用sys.path.insert()、sys.path.append()进行添加。

3.2 pip安装包时会把包安装到哪个目录

在相当长一段时间内,当操作系统同时存在python2和python3时,我知道使用pip安装python2的库使用pip3安装python3的库。但同时存在两个python3时不知道怎样指示pip给自己想要的python安装库。直到几个月前前领导说可以这么安装:

# 假设系统现在有python36和python38两个python3版本

# 给python36安装faker库

python36-m pip installfaker

# 给python36安装faker库

python38-m pip install faker

这确实是安装python库的一个解决方案,但这并没有正面回答 “pip安装包时会把包安装到哪个目录”这个问题,所以并不令人足够满意。同时我一直比较疑惑:为什么"python -m pip"和直接运行pip效果是一样的。直到直接查看pip文件内容后,这些问题都豁然开朗。

pip并不是一个二进制文件,而是一个python脚本;pip开头使用“#!”指示了运行该文件使用的解析器;"python -m pip"和直接运行pip最终都是执行pip包下的main函数,他们本质就是一个东西所以效果肯定也一样。

所以最终的结论是:pip把包安装到运行pip的解析器(pythonx.y)的"../lib/pythonx.y/site-packages"目录下;虽然未验证,但基本可以断定更本质是pip把包安装在其同级目录下,而pip的来源又取决于sys.path。

3.3 直接回答新旧版本python是否存在相互影响

经前边的分析可知,导入包和安装包都取决于sys.path而sys.path由python解析器自己决定,所以新旧版本python(在没有发生文件覆盖的情况下)不会相互影响。

更简单直白点,只要你用的python命令是你想要用的那个版本,import库和pip安装库都不会有问题。

四、虚拟环境

4.1 创建和使用虚拟环境

所有项目都使用一下python环境,会出现两个问题,一是久了就分不清哪些库是哪个项目所需要的不好整理依赖关系,二是不同项目可能依赖相同库的不同版本产生冲突。

所以当前主的做法是推荐不同的项目都使用一个独立的虚拟环境。

# 创建虚拟环境

# 含义:python3调用venv模块,创建一个名叫test_env的虚拟环境

# 本质上是把python38文件夹复制一份到当前目录下,并重命名为test_env

# 并不需要绝对路径,只是我这python38没加入环境,所以使用绝对路径

# 创建的虚拟环境默认是在当前执行创建命令的目录下/opt1/python38/bin/python3 -m venv test_env

# 使用新建的虚拟环境

source test_env/bin/activate

# 退出上边激活的虚拟环境

# 本质是test_env/bin/activate中的deactivate方法

deactivate

# 删除虚拟环境

# 毕竟只是创建了个文件夹,所以要删创建的虚拟环境,直接把整个文件夹删除即可rm -rf test_env

4.2 使用虚拟环境时到底修改了什么

在上边创建虚拟环境的截图中我们可以看到,激活之后发生了两个变化:python变成了虚拟环境的python,命令行前也多了虚拟环境的名称。

这两个变化是如何实现的呢,即然是"source test_env/bin/activate"会发生的,我们直接看test_env/bin/activate文件中做了什么即可。+

可以看到主要做了两件事,一是修改PATH变量把当前虚拟环境bin目录加到PATH变量的最前面,这就确保使用的python是虚拟环境中的python。

二是修改PS1变量把虚拟环境的名称加到PS1变量前面,这就实现了命令行前多了虚拟环境的名称。(使用conda时其效果与此类似,实现方法也是一样的)

再回头看deactivate,主要做的主要是与activate相反的两件事:还原PATH变量,还原PS1变量。

python详细安装教程linux-Linux手动安装新版本Python教程(CentOS)相关推荐

  1. linux源码安装浏览器,Linux系统手动安装Firefox浏览器

    大多数Linux发行版都以Firefox作为默认的浏览器,并可以轻松地从软件库中安装.例如: Debian/Ubuntu: sudo apt-get install firefox Fedora: s ...

  2. Windows下Python包和模块的安装方法(亲测手动安装)

    1.pip安装 上一章中,介绍了Anaconda的安装,安装好Anaconda后,就默认安装了包管理工具pip.有的人喜欢使用easy_install,但是这需要你先安装easy_install,其实 ...

  3. 得力标签打印机,驱动程序安装不上,手动安装好打印没反应

    环境: 电脑:惠普288 pro G6 系统:Windows 10 专业版 64位 标签打印机:得力DL-730C 问题描述: 得力标签打印机,驱动程序安装不上,手动安装好打印没反应,设备列表有打印机 ...

  4. 如何下载Office365离线安装程序包并手动安装?

    如何下载Office365离线安装包并手动安装? ©Lander Zhang 专注外企按需IT基础架构运维服务,IT Helpdesk 实战培训践行者 博客:https://blog.51cto.co ...

  5. linux apache 手动安装教程,linux下手动安装apache

    下面是官方文档的要求,必须安装APR.APR-Util.PCRE,gcc-c++等包,文档URL地址http://httpd.apache.org/docs/2.4/install.html. 所以, ...

  6. mysql linux 手动安装mysql服务_Linux手动安装Mysql

    以下是摘自mysql官方文档中关于手动安装MySQL 二进制分发版的说明: 一:安装 必须执行以便安装并使用MySQL 二进制分发版的基本命令是: shell groupadd mysql shell ...

  7. 无root 权限 linux安装 rar,centos上如何yum安装rar/unrar及手动安装最新rar

    这篇文章因为年代久远,因为部分源失效,导致不可用,最新的教程见Linux中安装rar [root@hello ~]# yum install unrar centos                 ...

  8. linux php mysql安装包下载_在linux下手动安装 apache, php, mysql--终极版

    卸载dnf安装的httpd: 纯文本照样可以做到 "有格式的", 通过 "缩进, 空格, tab, 连字符如- , : , ... 等" . 有一个基本原则就是 ...

  9. linux 内网gcc版本安装,linux下手动安装/升级GCC到较高版本

    1.环境 VMWare+Centos7html 2.写在前面的话 安装GCC最简单的方式固然是[yum -y install gcc] 可是个人机器上安装下来后,其版本是4.8.5,感受有点低,因此想 ...

  10. mac nginx 非brew安装_Nginx服务器环境手动安装Discuz! Q非详细教程

    Discuz! Q Discuz! Q是原腾讯旗下Discuz团队新开源的社区程序,不过定位当然和以前不一样. 前段时间就知道Discuz! Q内测这事,不过一直没兴趣,昨天看见腾讯云这边有个Disc ...

最新文章

  1. Oracle 12c 新特性之 temp undo
  2. windows container (docker) 容器资料笔记
  3. 【ssh从零单排】关于HTTP Status 404的debug问题
  4. JavaScript设计的漂亮的玫瑰花
  5. 树链剖分 完美的想法
  6. 算法设计与分析——动态规划——数字三角形问题
  7. Ogre:ManualObject
  8. cpu内存和线程和pool多进程池 Python
  9. 数据类型 --生成器
  10. proteus 直流可调稳压电源
  11. 汇编(三):DEBUG
  12. python中的与或非详解
  13. 剑指offer做题记录
  14. 【数据结构与算法】删除线性表中的零元素
  15. Mysql 查询患某种疾病的患者
  16. opencv实战案例之照片背景替换
  17. 祝您健康:抢救脑溢血患者的神奇秘方:针刺十宣穴,涌泉穴
  18. JAVA实现删除文件夹和文件
  19. Android webView长按保存图片到本地相册(队列下载实现)
  20. 高斯消元法(二):高斯消元法原理

热门文章

  1. (转载)解决macOS /usr/include 无法写入或者不存在的问题
  2. Charles 4.2.1 HTTPS抓包
  3. 最小哈希 minhash
  4. 利用Minhash和LSH寻找相似的集合
  5. prefixspan是挖掘频繁子序列,子序列不一定是连续的,当心!!!
  6. 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...
  7. DNS通道检测 国外学术界研究情况——研究方法:基于流量,使用机器学习分类算法居多,也有使用聚类算法的;此外使用域名zif low也有...
  8. sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID...
  9. jquery的$.extent()方法的总结
  10. VirtualBox Ubuntu虚拟机串口编程