Python 包管理工具 pip

Python 包管理工具 pip_第1张图片

可能每个 Python 初学者都试过使用 pip install 来安装 wordcloud、pygame 等第三方包。但 pip 包管理工具究竟是什么;有哪些参数选项用法;如何在 Pycharm 中管理已安装的包;除了 pip 还有什么其他 Python 包管理工具,这些问题可能就不是完全清楚了。本文就来简单探索一下 pip 。

文章目录

    • 写在前面:三条提示
    • pip 简述
    • 检查(安装) pip
    • 安装包
      • 从 PyPI 安装
      • 使用 PyPI 镜像站
    • 升级包
    • Requirement Files
      • 从 requirements 安装
      • 生成 requirements
      • 微调需求
      • 生产环境 vs 开发环境
    • 寻找包
      • pip 命令行
      • PyPI 网页
      • 社区论坛
    • 卸载包
      • 检查依赖关系
      • 卸载
    • pip help 信息
    • 其他包管理工具
      • Conda
      • Pipenv
      • Poetry
    • 在 Pycharm 中进行包管理
      • 查看已安装的包
      • 升级包、卸载包
      • 更换 PyPI 镜像源
      • 安装包
    • 参考文档与扩展链接

写在前面:三条提示

本文涉及的所有命令均为在 Windows 终端(例如 Windows 10 的 PowerShell)中执行,而非在 Python 交互式解释器中。如果你不小心犯了这样的错误,会是下面这样

>>> python --version
Traceback (most recent call last):
  File "", line 1, in <module>
NameError: name 'python' is not defined

回到正确的终端运行即可,也就是每行最前面没有 >>> 提示符的。

  1. 本文首发于 我的博客,可以点击下面的链接查看,目录结构更清晰。

pip与Python包管理 - muzing的杂货铺

  1. 博客原文中的命令均为 Linux/macOS 适用。和我一样使用 Linux 的小伙伴请切记慎用 sudo,最好新建一个虚拟环境再实验。

pip 简述

pip 是 Python 的一个包(Package)管理器,用来安装和管理 Python 标准库之外的其他包(第三方包)。从 Python 3.4 起,pip 已经成为 Python 安装程序的一部分,也是官方的标准的 Python 包管理器。

检查(安装) pip

首先确保可以在命令行运行 Python:

python --version

如果显示了 Python 版本号,则说明正常。

然后检查是否可在命令行使用 pip:

python -m pip --version

如果显示了 pip 版本则正常。否则,可以尝试从标准库引导(这个命令有时可以修复出现问题的 pip):

python3 -m ensurepip --default-pip

如果依然不能正常使用 pip ,可以考虑重新使用 Python 的 exe 安装包修复,注意在高级选项里面勾选 pip。

如果 pip 可用,可以先跳转到本文“升级包”一节查看升级 pip 的方法,将 pip 升级到最新版本。

安装包

从 PyPI 安装

安装最新版本的:

pip install "SomeProject"

安装指定版本的:

pip install "SomeProject==1.4"

安装大于等于某版本,且小于另一指定版本的:

pip install "SomeProject>=1,<2"

安装与特定版本兼容的版本:

pip install "SomeProject~=1.4.2"

这种情况下,会安装版本为 ==1.4.*>=1.4.2 的。

使用 PyPI 镜像站

由于直接使用 pip 从 PyPI 上安装时,需要从国外的服务器下载数据,网络连接速度往往较慢,常会出现下载安装失败的情况。

一种解决办法是手动设置 socket 超时时间(默认15秒)和断开重连尝试次数(默认5次):

pip install pyqt5 --timeout 120 --retries 10  # 超时时间120秒,重试10次

另一个更好的方法是从国内的镜像站下载包文档。

以清华大学开源软件镜像站为例:

临时使用(只对这一次安装有效)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

使用该镜像站升级 pip:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U

设为默认下载源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

会将该配置写入到用户目录下的 /pip/pip.conf 文件中,例如在我的机器(Linux 系统,与Windows 略有不同)上:

$ python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
Writing to /home/muzing/.config/pip/pip.conf

查看 pip.conf 的内容,可以看到写入的内容

$ cat ~/.config/pip/pip.conf 
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

升级包

升级包到最新版本的命令如下:

pip install --upgrade SomeProject

这个命令也可以用于升级 pip 、setuptools、wheel 到最新版本

python -m pip install --upgrade pip setuptools wheel # 如果下载速度太慢,请参看上一节使用镜像站

虽然单独使用 pip 就可以实现从预构建的二进制归档(pre-built binary archives)安装,但使用最新版本的 setuptools 和 wheel 使你也能够从源文件(source archives)安装

Requirement Files

在 GitHub 上克隆他人的 Python 项目时,常常会有一个 requirements.txt 文件,Pycharm 也会提醒我们,是否根据该文件创建虚拟环境并安装包。其实这个文件里面就列出了该项目所使用的所有第三方 Python 包及其版本信息。我们在写自己的 Python 项目时也应创建一个文本文件,写明项目的包依赖,并根据惯例命名为 requirements.txt 。

从 requirements 安装

打开已有 requirements.txt 的项目,使用如下命令安装需求文件中指定的包:

pip install -r requirements.txt

生成 requirements

在写自己的 Python 项目时,如果想要创建依赖文件,可以使用下面的命令:

pip freeze > requirements.txt

直接使用 pip freeze 命令的缺点是,会把当前 Python 环境中所有已安装的包都列出来,而不管这些包是否被 import 引入使用。为解决此问题,可以使用 pipreqs 一类的第三方库来生成 requirements:

pip install pipreqs # 安装 pipreqs
pipreqs <Project_Dic> --encoding=utf-8 # 生成 requirements,将  替换为你的项目路径

微调需求

有时我们并不需要指定第三方包的版本严格等于(hardcoding)目前使用的版本

一般来讲,包都是向后兼容的,且新版本的包往往有修复 bug 、提升性能等优化,我们希望可以安装更新版本的包。

但也有一些情况,太新版本的包可能会出现问题,如对旧版本不兼容的更改(可能出现在大的版本号更新时)、破坏包之间的依赖关系等。例如,假设未来某天 requests 包推出了3.0版本,且语法和目前的 2.* 不相同,就会让现有的项目出现问题,因此需要避免。

可以在 requirements 文件中使用逻辑运算符,较为灵活的控制包的版本。

例如,在编辑器中打开 requirements.txt 文件,并进行如下修改:

certifi>=2018.11.29
chardet>=3.0.4
idna>=2.8
requests>=2.21.0, <3.0
urllib3>=1.24.1

再使用 pip 安装或升级包时,就会按照此要求安装指定范围内的最新版本。

生产环境 vs 开发环境

由于生产环境和开发环境的不同,对有些包的需求也不同。开发环境中往往安装了更多用于测试等功能的辅助性包,这些包在生产环境中是不需要的。

可以创建第二个 requirements 文件(requirements_dev.txt)来列出创建开发环境所需要的其他工具,例如:

# In requirements_dev.txt
-r requirements.txt
pytest>=4.2.0

由于 pip 允许在 requirements 文件中指定其他参数,所以可以加上一行 -r requirements.txt,这样直接使用

pip install -r requirements_dev.txt

就可以安装所有开发环境所需要的包了。

而此时在生产环境继续使用命令:

pip install -r requirements.txt

就不会安装 pytest ,保持了生产环境的轻量可靠。

寻找包

pip 命令行

可以使用 pip search 命令搜索包,下面列出了该命令的 help 文档

$ pip3 help search

Usage:   
  pip3 search [options] <query>

Description:
  Search for PyPI packages whose name or summary contains <query>.

Search Options:
  -i, --index <url>           Base URL of Python Package Index (default
                              https://pypi.org/pypi)

PyPI 网页

然而相比在命令行工具进行搜索,只能看到包的简短描述信息,更好的方法是在浏览器中打开 PyPI 网页,搜索查看包的详细信息。

Python 包管理工具 pip_第2张图片

社区论坛

另外,多关注社区动态、博主分享、Python 公众号等,多逛逛 GitHub ,往往能收藏到很多强大易用的优秀 Python 包。

卸载包

检查依赖关系

在卸载包之前,请先运行 pip show 命令检查该包:

pip show [package-name]  # 检查 [package name] 的信息

例如:

$ pip3 show pyqt5
Name: PyQt5
Version: 5.15.4
Summary: Python bindings for the Qt cross platform application toolkit
Home-page: https://www.riverbankcomputing.com/software/pyqt/
Author: Riverbank Computing Limited
Author-email: [email protected]
License: GPL v3
Location: /usr/local/lib/python3.8/dist-packages
Requires: PyQt5-Qt5, PyQt5-sip
Required-by:

注意最后的两个字段 Requires 和 Required-by 。可以看到,在我的机器上 PyQt5 包依赖于 PyQt5-Qt5 和 PyQt5-sip 这两个包,如果卸载它们,则 PyQt5 也就不能正常使用了。没有任何包依赖于 PyQt5,因此直接卸载 PyQt5 是安全的。

卸载

卸载命令:

pip uninstall [package-name]

卸载包时会显示要删除的文件,并要求确认。如果已经在上一步中检查确认了该包是可以删除的(没有被其他包依赖),那么可以加上一个 -y 选项来跳过显示文件列表和确认:

pip uninstall [package-name] -y

也可以在一行命令中卸载多个包,包名之间用空格隔开即可:

pip uninstall [package-name-1] [package-name-1] [package-name-1]

还可以通过 -r 选项来卸载 requirements 中列出的所有包,当检查确认不会破坏其他依赖关系后,运行下面的命令:

pip uninstall -r requirements.txt -y

pip help 信息

在这里列出了命令行 pip help 返回的帮助信息,并尽我所能做了简单翻译。

使用 pip help 命令查看某个命令的具体帮助。

$ pip3 help

Usage:   
  pip3 <command> [options]

Commands:
  install                     安装包
  download                    下载包(只下载不安装)
  uninstall                   卸载包
  freeze                      以 requirements 格式列出所有依赖包
  list                        列出所有已安装的包
  show                        显示已安装包的信息
  check                       验证已安装的包是否具有兼容的依赖项
  config                      管理本地和全局配置
  search                      在 PyPI 中搜索包
  cache                       检查和管理 pip 的 wheel 缓存
  index                       检索包索引中的可用信息
  wheel                       为你的 requirements 构建 wheel
  hash                        计算包档案的 hash 值
  completion                  A helper command used for command completion.
  debug                       显示对 debug 有用的信息
  help                        显示命令的帮助

General Options:
  -h, --help                  显示帮助
  --isolated                  以隔离模式运行 pip ,忽略环境变量和用户配置
  -v, --verbose               显示更多的输出。此选项可累加,且最多3次
  -V, --version               显示版本并退出
  -q, --quiet                 显示更少的输出。 此选项可累加,且最多三次 (对应于 WARNING,
                              ERROR, 和 CRITICAL logging 等级)
  --log <path>                附加详细日志的路径
  --no-input                  禁用提示输入
  --proxy <proxy>             使用该形式指定代理:
                              [user:passwd@]proxy.server:port
  --retries <retries>         每个连接尝试重新连接的最大次数(默认为5次)
  --timeout <sec>             设置 socket 超时时间(默认15秒)
  --exists-action <action>    路径已存在时的默认操作:
                              (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort
  --trusted-host <hostname>   标记此 host 或 host:port 为受信任的,
                              即使它没有有效的HTTPS, 甚至没有 HTTPS
  --cert <path>               PEM-encoded CA certificate bundle 的路径 
                              如果提供了该项,则覆盖默认值
                              查看 pip 文档中的 'SSL Certificate Verification'
                              以查看更多信息
  --client-cert <path>        SSL 客户端证书的路径,
                              一个单独的包含私钥和 PEM 格式证书的单个文件
  --cache-dir <dir>           将缓存数据存储在 <dir> 中
  --no-cache-dir              禁用缓存
  --disable-pip-version-check 不要定期检查 PyPI 以确认是否有新版本 pip 可下载。
                              使用 --no-index 关闭提示
  --no-color                  关闭彩色输出
  --no-python-version-warning 关闭 即将不受支持的 Python 的警告
  --use-feature <feature>     启用可能向后不兼容的新功能
  --use-deprecated <feature>  启用将在未来被移除的已弃用功能

其他包管理工具

Conda

Python 包管理工具 pip_第3张图片

如果你使用过 Anaconda,那么一定不会对 Conda 包管理器感到陌生。Conda 是包括 Python 在内的许多语言的包、依赖项和环境的管理器,广泛应用于数据科学和机器学习领域。

Pipenv

Python 包管理工具 pip_第4张图片

Pipenv 官网

Pipenv GitHub 首页

Poetry

Python 包管理工具 pip_第5张图片

Poetry 官网

Poetry GitHub 首页

在 Pycharm 中进行包管理

不同版本 Pycharm 界面可能有微小差异,这里以 Pycharm Community 2021.2.2 为例。

查看已安装的包

在设置中找到“项目 —— Python 解释器”,即可查看已经安装的包、包的版本、包的最新版本。

Python 包管理工具 pip_第6张图片

升级包、卸载包

在这个界面选中某个包之后,点击升级(向上三角)按钮、卸载(减号)按钮即可。

Python 包管理工具 pip_第7张图片

更换 PyPI 镜像源

这里通过图形界面列出的各种包信息,其实还是默认从https://pypi.python.org/simple 源获取的信息,所以可能加载很慢,必要时可以更换为国内镜像源。

先点击安装包的按钮(卸载包、升级包按钮左边那个加号按钮),进入安装包的界面

Python 包管理工具 pip_第8张图片

在这个界面点击左下角“管理仓库”

Python 包管理工具 pip_第9张图片

在这里点击左上角加号添加其他源,或直接把默认的 https://pypi.python.org/simple 改为其他源

Python 包管理工具 pip_第10张图片

这是我的配置,只设置了一个清华镜像站的源。

安装包

完成更换镜像源之后,就可以安装包了。在搜索框内输入想要安装的包,会列出许多搜索结果,可以一一点开查看包描述,然后安装我们需要的那个,还可以手动勾选安装指定版本。

Python 包管理工具 pip_第11张图片

参考文档与扩展链接

  • Python 软件包用户指南:安装 Python 分拨包
  • What Is Pip? A Guide for New Pythonistas - Real Python
  • PyPI - The Python Package Index
  • 清华大学开源软件镜像站 pypi 镜像使用帮助

PyPI 读音为 Pie Pea Eye

你可能感兴趣的:(python,pycharm,pip)