【Python 笔记】Linux下安装pip方法的全总结 | 您所在的位置:网站首页 › linux重装linux › 【Python 笔记】Linux下安装pip方法的全总结 |
本文研究记录了 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 包管理工具安装 pipDebian / 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 实验室设备网 版权所有 |