目录

  • 1.前言
  • 2.问题描述
  • 3.python2和python3
  • 4.pip,pip2和pip3
  • 5.使用特定的pip包安装
  • 6.结语

1.前言

​ 这篇文章是个人理解总结,仅用于个人笔记记录。

​ 参考文献:参考1 参考2 参考3

2.问题描述

为了安装一个包需要更新在ubuntu上更新python3的版本。ubuntu16默认的python是python2.7和python3.5,但是我安装的包用到matplotlib,需要最低python3.6的版本,所以安装了python3.6,并且按照我前面的笔记 如何升级Ubuntu上的python版本 进行了安装。这里再次强调一定不要卸载ubuntu自带的python,有需要别的版本的话额外安装即可。

由于我安装了python3.6后,把python3的软链接指向了Python3.6,然后之前python3.5用的pip3就出了问了(好像是不能用,具体我忘了),所以后面我就进行了各种修复之路。最后修复成功了,但是我不确定方法是否恰当和正确。故仅作为我的个人笔记

3.python2和python3

python2和python3是两个大的 python版本,我们安装的都是具体版本,比如python2.7,python3.5等。但是在调用python或者python3命令的时候,通常是python命令对应某个python2的具体版本,比如python2.7;python3命令对应某个python3的具体版本,比如python3.5。如下图所示,为默认情况下在Ubuntu16.04上的结果:

当然这是一般情况。实际上命令python或者python3都是调用了一个软链接,这个软链接指向哪个python版本,那么最后调用的就是哪个python版本。因此通过修改软连接的指向,可以让命令python对应某个python3的具体版本,而让命令python3对应某个python2的具体版本。(当然不推荐这样做)

​ 具体操作见 参考1 。

4.pip,pip2和pip3

首先要明确的一点是,每一个python版本,如果安装了pip,都会对应一个这个版本的pip包。比如python2.7对应的是pip2.7,python3.5对应的是pip3.5,python3.6对应的是pip3.6。如果在安装pip包的时候,用的是sudo命令,也就是启动了root用户权限,那么这几个pip文件都在/usr/local/bin目录下,如图所示:

但是可以看到,这个文件夹下还有pip、pip2和pip3这三个文件,我们在使用pip命令来安装包的时候用的一般都是pip和pip3命令。一般比较常见的说法是pip是python2用的,pip3是python3用的。这应该是默认的情况,同时安装了python2和python3,然后又按照命令sudo apt-get install python-pip安装python2用的pip,和sudo apt-get install python3-pip安装python3用的pip3。那pip2是啥?

我猜如下:

pip,pip2和pip3应该类似于python,phthon2和python3。也就是说,具体pip、pip2和pip3调用的是哪个版本的python的pip包(如上图中的pip2.7,pip3.5,pip3.6)也是可以改的,只要修改pip、pip2和pip3的文件内容即可。那么pip就是一个总体的名称,代表一种包管理工具。pip2和pip3为了方便记忆和区分,可以指向python2和python3的某个pip包。当然,就好像python、phthon2和python3可以指向任意的具体的python版本一样,pip、pip2和pip3也可以指向具体的python的pip包(如上图中的pip2.7,pip3.5,pip3.6)。同理,就像python命令一般指向python2、phthon3命令一般指向python3、而不单独声明python2一样,pip命令保持与python命令的同步,pip2一般也不常用了。

Ubuntu16.04默认安装的python版本是python2.7和python3.5;pip命令(或pip文件)对应的是pip2.7,pip3命令(或pip3文件)对应的是pip3.5;并且pip2.7和pip3.5的版本都是8.1.1。但是我安装python3.6后出现了pip3不能用的情况,所以我又重装了pip3,这就导致pip和pip3都指向了pip3.6。

修改方法

进入到/usr/local/bin目录,我们只要修改pip和pip3文件的内容即可。执行命令 sudo gedit pip或者sudo gedit pip3进行修改。如果像我的问题那样, 这俩文件内容应该都是:

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])sys.exit(main())

可以看到第一行的 #!/usr/bin/python3.6说明这俩命令(pip和pip3)已经都指向了python3.6的pip3.6包,所以导致了上面的情况。

而这两个文件默认的内容应该是(这里有待考证,因为原版的文件由于我安装python3.6的pip已经被修改了,最好找个系统盘进去看一下。这里的文件内容是我参考网上修改,然后解决了pip和pip3的指向问题)

/usr/local/bin/pip

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==8.1.1','console_scripts','pip'
__requires__ = 'pip==8.1.1'
import sys
from pkg_resources import load_entry_pointif __name__ == '__main__':sys.exit(load_entry_point('pip==8.1.1', 'console_scripts', 'pip')())

/usr/local/bin/pip3

#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==8.1.1','console_scripts','pip3'
__requires__ = 'pip==8.1.1'
import sys
from pkg_resources import load_entry_pointif __name__ == '__main__':sys.exit(load_entry_point('pip==8.1.1', 'console_scripts', 'pip3')())

从上面两个文件可以看出,pip的版本都是8.1.1(不论是pip还是pip3,声明版本的语句都是pip==x.x.x)。而pip文件第一行的python,意味着pip文件指向的是python这个软连接指向的python版本的pip包,由于Ubuntu默认python这个软连接指向的是python2.7,所以pip文件指向的应该是pip2.7。pip3文件第一行的python3,意味着pip3文件指向的是python3这个软连接指向的python版本的pip包,由于Ubuntu默认python3这个软连接指向的是python3.5,所以pip3文件指向的应该是pip3.5。这样问题就解决了。

验证:

1.保持/usr/local/bin/pip/usr/local/bin/pip3文件内容如上,验证结果:

2.修改/usr/local/bin/pip/usr/local/bin/pip3的内容,让pip文件和pip3文件的内容互换,那么pip和pip3命令的指向也应该互换。验证结果:

5.使用特定的pip包安装

既然已经知道了pip和pip3本质调用的是某个具体版本的python的pip包(比如pip2.7,pip3.5等),那么想把某个包安装到指定的python版本下,就可以直接调用这些pip包命令来安装到对应的python版本了。

sudo pip2.7 后面接 list或install
sudo pip3.5 后面接 list或install

​ 或者:

$ python3.5 -m pip 后面接 list或install
$ python3.6 -m pip 后面接 list或install
$ python2.7 -m pip 后面接 list或install

Tips:

  1. 我的pip还是出了点问题,使用第二种方式的命令报错,第一种方式可用,不过我也不想搞了。参考3 这里写的这方面比较多。

  2. pip文件不仅存在于/usr/local/bin/下,在~/.local/bin/下也有(隐藏目录,Ctrl+H打开隐藏目录可见),这个文件夹对应的应该是用户目录,安装的时候不用sudo。而前者文件夹下的需要sudo。

  3. 网上有人说不建议pip命令使用sudo,会导致系统混乱。我也不清楚

  4. ubuntu的which、whereis、locate和find命令

    which    # 只能寻找执行文件 ,并在PATH变量里面寻找。whereis  # 从linux文件数据库(/var/lib/slocate/slocate.db)寻找,所以有可能找到刚刚删除,或者没有发现新建的文件。locate   # 同上,不过文件名是部分匹配。find     # 是直接在硬盘上搜寻,功能强大,但耗硬盘,一般不要用。
    

6.结语

ubuntu自带的python最好还是不要动,不然都是麻烦。

Ubuntu16.04下多版本pip共存相关推荐

  1. Ubuntu16.04下部署 nginx+uwsgi+django1.9.7(虚拟环境pyenv+virtualenv)

    由于用的新版本系统,和旧的稍有差别,在网上搜了很多相关资料,搞了三天终于搞好在Ubuntu16.04下的部署,接下来就详细写写步骤以及其中遇到的问题.前提是安装有虚拟环境pyenv+virtualen ...

  2. Ubuntu16.04下caffe CPU版的详细安装步骤

    一.caffe简介 Caffe,是一个兼具表达性.速度和思维模块化的深度学习框架. 由伯克利人工智能研究小组和伯克利视觉和学习中心开发. 虽然其内核是用C++编写的,但Caffe有Python和Mat ...

  3. ubuntu16.04下dyna-slam编译运行

    ubuntu16.04下dyna-slam编译运行 1. 显卡驱动安装 2. cuda安装 cuda与cudnn换版本可参考 3. cudnn安装 4. ORB_SLAM2依赖 4.1 安装Pango ...

  4. Ubuntu16.04下安装tensorflow(CPU)spyder+pycharm

    1.下载并安装Anaconda 1.1 下载 从Anaconda官网(https://www.continuum.io/downloads)上下载Linux版本 https://repo.contin ...

  5. Ubuntu16.04下TensorFlow-GPU安装记录(GTX1060显卡)

    Ubuntu16.04下TensorFlow-GPU安装记录 1 确定电脑型号(重要的是显卡型号) 2 确定CUDA版本.ubuntu版本 3 Win10系统下安装Ubuntu组成双系统(简述过程) ...

  6. 工控机 ubuntu16.04 yolov5 cpu版本安装和开发

    工控机 ubuntu16.04 yolov5 cpu版本安装 背景 环境安装 结果 安装过程中yolov5报错: 配合pyrealsense2 做检测 通过二维点获取三维坐标 rospy发送msg 背 ...

  7. ubuntu16.04 下安装Opencv2.4.9

    ubuntu16.04 下安装Opencv2.4.9 OpenCV的源码download from:  https://sourceforge.net/projects/opencvlibrary/? ...

  8. Ubuntu16.04下Hadoop 2.7.3的安装与配置

    一.JAVA环境搭建 (1)下载JDK并解压(当前操作系统为Ubuntu16.04,jdk版本为jdk-8u111-linux-x64.tar.gz) 新建/usr/java目录,切换到jdk-8u1 ...

  9. Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 在这篇博客里,我采用了非官网的安装步骤,来进行安装.走了弯路,同时,也是不建议.因为在大数据领域和实际生产里,还是要走正规的为好. Ubuntu16.04下Mongodb(离线安 ...

最新文章

  1. 使用VSCode写Python代码的推荐安装的插件
  2. 河北地质大学硕士专业介绍:计算机类
  3. ABP虚拟文件系统(VirtualFileSystem)实例------定制菜单栏显示用户姓名
  4. 架构设计 | 异步处理流程,多种实现模式详解
  5. js for in遍历对象_JS中轻松遍历对象属性的几种方式
  6. java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
  7. java i%10==3_Java学习笔记(三)
  8. Centos7 升级稳定版 openssl
  9. SQL SERVER 2008的转置函数PIVOT
  10. 如何开发一个完整的JavaScript组件
  11. ev3编码软件linux,机器人编程软件下载 乐高ev3机器人编程软件(LEGO MINDSTORMS EV3 Home Edition)V1.3.1 中文安装版 下载-脚本之家...
  12. 你好,李焕英;再见,唐探3?
  13. defy翻新机鉴别方法
  14. html做群聊通讯方法,一例完整的websocket实现群聊demo
  15. 一个IT小菜鸟的成长之路
  16. 2018.11.22!今天重温一遍知识点,捋一捋思路
  17. C# 实现视频预览功能(附源码)
  18. python正弦函数拟合_python生成任意频率正弦波方式
  19. ajax怎么解决报414,414request怎么解决
  20. R语言怎么写积分_会员积分规则怎么写?

热门文章

  1. 关于DHCP跨网段分配和思科WLC的跨网段分配
  2. 关于星号(**/*.java)
  3. 计算组合数C(n,i)时避免浮点数精度影响结果的解决方法
  4. 万众期待的Adobe Photoshop 2021 for Mac正式上线
  5. 人为什么觉得心累呢,很值得看!
  6. 业务流程重组实施步骤
  7. 简述安全生产主体责任概述
  8. 宇信易诚Liana银行系统软件界面设计
  9. 平面设计作品集如何设计更专业
  10. snagit 如何对录取的视频进行剪切,剪切掉不需要的部分