用户如何理解 pip¶
问题¶
我们希望了解 pip 的用户如何理解 pip 作为一种工具:他们认为它是什么,以及它做什么。
研究¶
为了捕捉参与者对 pip 和包管理的思维模型,我们向参与者提出了以下问题
用您自己的语言解释 pip 是什么
用您自己的语言解释 pip 安装软件包时会发生什么
用您自己的语言解释 Python 包依赖是什么
当我们谈论思维模型时,我们谈论的是“深层”或“浅层”思维模型。当用户对某事有深层的思维模型时,他们对很多细节有深刻的理解,浅层模型则相反。
为了评估这些思维模型 - 它们是否与 pip 和包管理的现实相符 - 我们与维护人员合作,确定了 1. pip 的行为和活动(18 个方面)和 2. 包依赖的方面(13 个),以及 Python 包依赖是什么(10 个)。然后,我们根据这些对参与者的答案进行评分。
结果¶
分析侧重于具有 2 到 10 年 Python 经验的参与者。
超过 90% 的参与者对 pip 没有深入的了解 - 他们对 pip 是什么、它在安装过程中做什么以及对包管理的总体了解有限。然而,尽管参与者的理解程度较低,但只有 4 名参与者对 pip 是什么以及它做什么的理解存在事实上的错误。
参与者对 pip 安装过程中的发生情况略有更深的理解。最深入的答案包含了 13 个已识别方面的 7 个。中位数为 3。答案侧重于解决依赖关系、查找可能的包名称、下载资产和安装包。
参与者对软件依赖的理解仍然很浅 - 最深入的答案包含 8 个已识别方面。中位数为 3。答案侧重于软件依赖是代码重用的结果,约束包版本减少了依赖冲突的可能性。
完整数据可在 此电子表格 中获得。
对“用您自己的语言解释 pip 是什么”的回复¶
“pip 是一个用于管理 python 包的标准命令行工具。它有三个主要功能:(1)从存储库(通常是 pypi)获取和缓存 python 包或其依赖关系,(2)构建(如果需要)和安装 python 包 - 以及相关依赖关系 - 到 python 路径中的“site-packages”位置,以及(可选)(3) 卸载之前安装的包。” - 参与者 242608909(科学家,地球与大气科学系教授,使用 Python 7-10 年)
“Pip 是一个用于 python 的包管理系统。就像 linux 中的 apt 一样,它可以用来将公共或私有存储库中的包安装到调用 pip 命令的当前 Python 版本或环境中。” - 参与者 240364032(专业软件开发人员,使用 Python 7-10 年)
“pip 允许在您的环境中安装/更新/删除 python 库。pip 管理库。您需要其他东西来管理您的环境。要使用它,最简单的方法是 pip install
package-name
我建议使用 requirements.txt 并在您添加库时添加它,并在每次更改时执行 pip install -r requirements.txt。这样可以避免在项目结束时忘记一个库 :)” - 参与者 241178995(数据科学家,从事软件工程工作)
“python 的 npm/cargo/opam… 专门用于 python 库和应用程序的包管理器和生态系统” - 参与者 240306262(自学成才的 Python 创意艺术家和 Web 开发人员,使用 Python 5-6 年)
“一种用于下载和安装包并解决依赖关系的工具。我认为它与 Linux 世界中的 yum、zypper 或 apt-get install 处于同一领域。” - 参与者 240306204(使用 Python 进行科学研究和数据分析 3-4 年)
“Pip 是 Python 社区中主要用于安装包的工具。(“包”在 Python 中有两个不同的含义;它可以是包含模块和其他包的
import
语句的目标,或者它可以意味着具有定义接口的代码集合,可以安装以供重复使用。我在这里指的是第二件事。)Pip 的实现定义了在 Python 环境中安装包的含义。任何想要将软件安装到 Python 环境中的其他工具(如 conda)都必须匹配 Pip 的实现。” - 参与者 240313922(大学计算机安全研究员,使用 Python 7-10 年)
对“用您自己的语言解释 pip 安装软件包时会发生什么”的回复¶
“我认为 pip 在包存储库(默认情况下为 PyPI,但可以更改)中查找包“tea”。如果找不到,它会报错。如果存在,它会下载有关包的一些信息,比如它以何种形式存在。这可能是一个轮子,或者是一个需要构建的包。如果它是一个轮子,它会检查依赖关系并安装它们,然后它会安装轮子(不确定这意味着什么,可能它会解压缩它)。轮子是特定于 python 发行版和基本操作系统的,因此它可能在某些平台上可用,但在其他平台上不可用。如果它是一个需要构建的包,pip 会下载包源(或克隆存储库)并运行 setup.py,这将安装依赖关系和其他包,然后是包本身。我忘了说在安装之前,会有一些检查来检查所需版本的兼容性以及其他包所需版本。” - 参与者 240426799(科学研究员 - 数据分析和计算机视觉模型,使用 Python 5-6 年)
“pip 搜索包源(对我来说使用默认源,即 Pypi),然后请求包源提供给定名称和版本的包(如果指定),然后如果包可用,它会以最合适的格式(取决于我的平台)下载包,然后解压缩包并运行安装程序(很可能调用包含的 setup.py 文件的 setuptools),这将执行所需的安装步骤。此安装过程可能包含依赖关系(通常在 setup.py 中指定),这将触发对依赖关系的相同过程,依此类推,直到所有依赖关系都被安装(如果一切正常)。" - 参与者 240670292(工业系统控制软件开发人员,使用 Python 5-6 年)
“Pip 检查 PyPI(默认的包索引,假设没有被覆盖)以查找与
tea
匹配的包。它使用各种规范(例如,操作系统兼容性、Python 兼容性等)来查找与我的系统兼容的tea
的最新版本。在该版本中,它会找到最佳的安装匹配(例如,wheel
,如果我的系统和我的pip
版本支持,并且包含相关的版本支持 [例如,最近的 manylinux2010],可能会回退到源代码分发)。下载相关分发后,它会根据install_requires
的setuptools.setup()
方法,递归地对依赖关系链执行相同的操作。获取所有相关包后,它会根据其设置方法执行安装 - 通常,这涉及将 python 文件提取到特定的系统路径,但根据需要可能还会增加各种复杂程度,例如编译、系统库绑定等。我相信新的解析器会通过同时执行所有查找来更改上述行为(例如,通过构建和解决依赖关系图而不是逐步遍历),但我还没有阅读 PEP 来了解更多信息。我以上面的解释是基于 setuptools 的 - 我认为最近添加了一步,首先检查 pyproject.toml 以允许此处使用其他系统,但我发现添加的自定义功能对生态系统造成了负面影响,还没有尝试过 - 整个 Poetry/Pipenv/Pipfile.lock/Flit 的事情似乎只是在增加不必要的复杂性;知道自己在做什么的用户多年来已经为他们的包解决了所有这些问题,而发现瓷器让他们的生活更轻松的用户无论如何都会遇到 UX 问题。” - 参与者 241463652(使用 Python 5-6 年)
“pip 从 pypi(至少在线)获取茶包,并将文件的副本下载到我的本地 venv 中。” - 参与者 243434435(数据分析和机器学习,使用 Python 1-2 年)
“从 pypi 中查找包的最新版本。” - 参与者 243897973(使用 Python 3-4 年进行软件测试/编写自动化测试)
“下载、解压缩,有时为我的目标架构编译模块。” - 参与者 243428875(使用 Python 7-10 年进行系统管理)
建议¶
很难知道该推荐什么。一些想法
问题:用户真的需要了解 pip 在做什么吗?
更好的文档
描述 pip 执行的“功能块”以及在它崩溃时如何处理它们
整理包管理器培训和帮助
改进 pip 输出以公开不同的 pip 功能块