【Python 笔记】Linux下安装pip方法的全总结 您所在的位置:网站首页 linux重装linux 【Python 笔记】Linux下安装pip方法的全总结

【Python 笔记】Linux下安装pip方法的全总结

2024-02-11 05:50| 来源: 网络整理| 查看: 265

本文研究记录了 Linux 下安装 pip 的全部方法.

文章目录 1. 通过 Linux 系统的包管理工具安装1.1 apt 包管理工具安装 pip1.1.1 安装1.1.2 升级1.1.3 issue5599 1.2 yum 包管理工具安装 pip 2. Linux 下源码安装 pip2.1 get-pip 在线工具2.2 ez_setup 在线工具2.3 setuptools 源码包2.4 pip 源码包

1. 通过 Linux 系统的包管理工具安装

  Installing pip/setuptools/wheel with Linux Package Managers 列出了绝大多数常见 Linux 发行版使用包管理工具安装 pip 的方法. 更多有关 python 包管理的内容点击 Python Packaging User Guide.

  根据我的经验和研究,Linux 系统包管理工具安装 pip 存在很多兼容性问题. 最好使用第 2. 节介绍的源码方式安装 pip.

1.1 apt 包管理工具安装 pip

  Debian / Ubuntu 等系统可以使用 apt 包管理工具安装 pip. 但是 apt 只提供 8.1.1 版本. 这个版本非常老旧,需要升级到最新版本才能方便使用.

  下面以 Ubuntu16.04 为例记录通过 apt 工具安装升级 pip 的过程. Ubuntu16.04 系统自带 python2.7 和 python3.5,使用 deadsnakes 源安装了 python3.6.

1.1.1 安装 $ sudo apt-get install python-pip python3-pip

如果不关心细节,可以略过以下的研究内容,直接阅读第 1.2 小节升级 pip 到最新版本.

安装路径为/usr/bin/.

$ ll /usr/bin/ | grep pip | grep -v l -rwxr-xr-x 1 root root 292 11月 10 2016 pip* -rwxr-xr-x 1 root root 283 11月 10 2016 pip2* -rwxr-xr-x 1 root root 293 11月 10 2016 pip3* pip 和 pip2 在 python-pip 包内.pip3 在 python3-pip 包内.

查看版本,为 8.1.1. 这是非常老的版本. 10.0 版本有重大升级,不与旧版本兼容.

$ pip -V pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) $ pip2 -V pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) $ pip3 -V pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

这三个可执行文件其实都是 python 脚本.

查看 pip.

$ cat /usr/bin/pip #!/usr/bin/python # GENERATED BY DEBIAN import sys # Run the main entry point, similarly to how setuptools does it, but because # we didn't install the actual entry point from setup.py, don't use the # pkg_resources API. from pip import main if __name__ == '__main__': sys.exit(main())

查看 pip2.

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

查看 pip3.

$ cat /usr/bin/pip #!/usr/bin/python3 # GENERATED BY DEBIAN import sys # Run the main entry point, similarly to how setuptools does it, but because # we didn't install the actual entry point from setup.py, don't use the # pkg_resources API. from pip import main if __name__ == '__main__': sys.exit(main())

说明:

pip 和 pip3 仅行首不同,也就是默认的 python 解释器不同pip2 使用了 pkg_resources,而另外 2 个没有

通过 apt 包管理工具安装实际上是将 setuptools (20.7.0)、pip (8.1.1)、wheel (0.29.0) 安装到系统 python 的默认包管理路径.

$ pip list ... pip (8.1.1) ... setuptools (20.7.0) ... wheel (0.29.0) ... $ pip3 list ... pip (8.1.1) ... setuptools (20.7.0) ... wheel (0.29.0) ...

其它 python3.x 版本也可以调用 pip.

$ python3.6 -m pip -V pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.6)

如果需要其它版本 python 使用 pip,使用如上调用方法. 不要修改 pip 可执行文件的行首去指定 python 解释器.

1.1.2 升级

使用 sudo -H 将升级的版本安装到系统路径 /usr/local/lib 下.

升级 pip.

$ sudo -H pip install -U pip

使用 -i 参数指定镜像源,提高下载速度.

$ sudo -H pip install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple Collecting pip Downloading https://pypi.tuna.tsinghua.edu.cn/packages/5a/4a/39400ff9b36e719bdf8f31c99fe1fa7842a42fa77432e584f707a5080063/pip-20.2.2-py2.py3-none-any.whl (1.5MB) 100% |████████████████████████████████| 1.5MB 1.2MB/s Installing collected packages: pip Found existing installation: pip 8.1.1 Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr Successfully installed pip-20.2.2

注意,升级时没有卸载 /usr/lib/python2.7/dist-packages 的 8.1.1 版本,将新版本安装到了 /usr/local/lib/python2.7/dist-packages.

查看版本,pip 和 pip2 命令已经升级.

$ pip -V pip 20.2.2 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7) $ pip2 -V pip 20.2.2 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7) $ pip3 -V pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

继续升级 pip3.

$ sudo -H pip3 install -U pip

同样指定镜像源加速.

$ sudo -H pip3 install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple Collecting pip Downloading https://pypi.tuna.tsinghua.edu.cn/packages/5a/4a/39400ff9b36e719bdf8f31c99fe1fa7842a42fa77432e584f707a5080063/pip-20.2.2-py2.py3-none-any.whl (1.5MB) 100% |████████████████████████████████| 1.5MB 1.3MB/s Installing collected packages: pip Found existing installation: pip 8.1.1 Not uninstalling pip at /usr/lib/python3/dist-packages, outside environment /usr Successfully installed pip-20.2.2

注意,升级时没有卸载 /usr/lib/python3/dist-packages 的 8.1.1 版本,将新版本安装到了 /usr/local/lib/python3.5/dist-packages.

$ pip3 -V pip 20.2.2 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

此时调用的 pip 脚本在 /usr/local/bin 下.

$ which pip /usr/local/bin/pip $ which pip2 /usr/local/bin/pip2 $ which pip3 /usr/local/bin/pip3

但是原来的 8.1.1 版本并没有被卸载,因为 /usr/bin 目录下的 pip 脚本依然存在.

$ /usr/bin/pip -V WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip. Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue. To avoid this problem you can invoke Python with '-m pip' instead of running pip directly. pip 20.2.2 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

调用 /usr/bin 目录下的 pip 脚本则会告警. 告警信息提示为了避免 pip 版本不兼容和调用错误,不要直接使用 pip 命令,而是使用 python -m pip的方式调用 pip. 详情可见 issue5599. 第 1.3 小节将简单说相关内容.

使用 python3.5 通过 -m pip 方式调用 pip. 被调用的是最新安装的 20.2.2 版本.

$ python3.5 -m pip -V pip 20.2.2 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

使用 python3.6 通过 -m pip 方式调用 pip. 被调用的却是旧的 8.1.1 版本.

$ python3.6 -m pip -V pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.6)

  这是因为升级的 20.2.2 版本被安装在 /usr/local/lib/python3.5/dist-packages 目录下. 这是 python3.5 的第三方库文件存储路径. 而 8.1.1 版本被安装在 /usr/lib/python3/dist-packages 目录下,这是系统 python3.x 的库文件路径,也就是说任何系统全局的 python3.x 都能调用该目录下的库. 与此同时,python3.6 的包存储路径 /usr/local/lib/python3.6/dist-packages 下还未安装 pip. 因而此时 python3.6 调用的是 pip 8.1.1 版本.

为 python3.6 升级 pip.

$ sudo -H python3.6 -m pip install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple $ python3.6 -m pip -V pip 20.2.2 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

查看 pip 可执行文件.

$ ll /usr/local/bin/ | grep pip -rwxr-xr-x 1 root root 226 9月 5 17:07 pip* -rwxr-xr-x 1 root root 223 9月 5 16:48 pip2* -rwxr-xr-x 1 root root 223 9月 5 16:48 pip2.7* -rwxr-xr-x 1 root root 226 9月 5 17:07 pip3* -rwxr-xr-x 1 root root 224 9月 5 16:52 pip3.5* -rwxr-xr-x 1 root root 226 9月 5 17:07 pip3.6*

查看调用的 python 版本

$ pip -V pip 20.2.2 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6) $ pip2 -V pip 20.2.2 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7) $ pip2.7 -V pip 20.2.2 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7) $ pip3 -V pip 20.2.2 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6) $ pip3.5 -V pip 20.2.2 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5) $ pip3.6 -V pip 20.2.2 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

  需要注意,在 /usr/bin/pip 升级而 /usr/bin/pip3 还未升级时,/usr/local/bin/pip 使用 python2.7 调用. 在 /usr/bin/pip3 升级后,/usr/local/bin/pip 和 /usr/local/bin/pip3 使用 python3.5 调用. 而在 python3.6 -m pip 升级后,/usr/local/bin/pip 和 /usr/local/bin/pip3 又都变成使用 python3.6 调用.

  也就是说,/usr/local/bin/pip 和 /usr/local/bin/pip3 的默认 python 版本会由于升级改变. 其实是这些可执行脚本的默认解释器被修改.

$ cat /usr/local/bin/pip #!/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())

手动修改 pip 可执行脚本的行首指定 python 版本会带来版本管理的混乱. 最好通过 pythonX.x -m pip 或 pipX.x 的方式指定 python 版本.

也可以使用--user 选项将升级的 pip 安装到用户路径 ~/.local/lib/pythonX.x/site-packages.

升级 python2.7 的 pip.

$ pip install --user -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple $ pip -V pip 20.2.2 from /home/localhost/.local/lib/python2.7/site-packages/pip (python 2.7)

升级 python3.5 的 pip.

$ pip3 install --user -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple $ pip3 -V pip 20.2.2 from /home/localhost/.local/lib/python3.5/site-packages/pip (python 3.5) $ python3.6 -m pip -V pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.6)

升级 python3.6 的 pip.

$ python3.6 -m pip install --user -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple $ python3.6 -m pip -V pip 20.2.2 from /home/localhost/.local/lib/python3.6/site-packages/pip (python 3.6)

可执行 pip 脚本在 ~/.local/bin 目录下.

$ ll ~/.local/bin/ total 32 drwxrwxr-x 2 localhost localhost 4096 9月 5 16:11 ./ drwx------ 5 localhost localhost 4096 9月 5 16:08 ../ -rwxrwxr-x 1 localhost localhost 226 9月 5 16:11 pip* -rwxrwxr-x 1 localhost localhost 223 9月 5 16:08 pip2* -rwxrwxr-x 1 localhost localhost 223 9月 5 16:08 pip2.7* -rwxrwxr-x 1 localhost localhost 226 9月 5 16:11 pip3* -rwxrwxr-x 1 localhost localhost 224 9月 5 16:09 pip3.5* -rwxrwxr-x 1 localhost localhost 226 9月 5 16:11 pip3.6* $ cat ~/.local/bin/pip #!/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()) 1.1.3 issue5599

如果安装 2.0 版本以前的 pip,例如 19.3.1 版本,会遇到 issue5599 中所描述的 bug.

$ sudo -H pip install -U "pip


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有