当输入"pip install xxx"时发生了什么

不知道你在下载一些包的时候有没有什么疑惑,输入了"pip install xxx" ,系统是如何找到对应的包的呢?

python的版本从2.7 到现在的3.11 它是如何解决程序包的兼容性问题的

pip 网页:https://pypi.org/simple/<somepackage>

https://pypi.org/simple/<somepackage>类似于一个导航页面

PEP440

PEP

要选择一个发行版,pip首先要确定哪些发行版与您的系统和 python 实现兼容。对于二进制轮子,它根据 PEP 425 解析文件名,提取python 实现、应用程序二进制接口和平台。python 实现可以是广泛的东西py2.py3(意思是“python 2.X 或 3.X 的任何实现”),或者它可以指定一个 python 解释器和主要版本,例如pp35(意思是 PyPy 版本 3.5)。应用程序二进制接口本质上是 C 扩展代码兼容的 CPython 的 C-API 版本(如果有的话)。解释兼容性标签的平台部分更加困难。它可以相对明显,例如win32对于 32 位 Windows,但我通常安装manylinux1轮子。与哪些 Linux 发行版兼容是邮件列表manylinux1中激烈争论的主题。distutils幸运的是,源代码分发的过程更简单——所有的源代码分发都被假定为兼容的,至少在流程的这个步骤中是这样

一旦pip有了兼容发行版的列表,它就会按版本对其进行排序,选择最新版本,然后为该版本选择“最佳”发行版。如果有的话,它更喜欢二进制轮子,如果它们是多个,它会选择最适合安装环境的一个。不过,这些只是pip的默认首选项——它们可以使用--no-binary或之类的选项进行配置--prefer-binary。“最佳”发行版是从本地缓存下载或安装的,在 Linux 上,本地缓存通常位于~/.cache/pip.

确定此发行版的依赖关系也不简单。理论上,可以只使用requires_dist来自 的值https://pypi.org/pypi///json。但是,这依赖于包作者上传正确的元数据,而旧的打包客户端不这样做。所以在实践中pip(以及其他任何想知道包依赖关系的人)都必须下载并检查它。

对于二进制轮子,依赖项列在一个名为METADATA. 但是对于源代码分发,当您使用命令执行其setup.py脚本时,依赖项实际上就是安装的任何内容install。除非您尝试,否则无法知道,这是什么pip!具体来说,它利用setuptools运行install直到它知道要安装哪些依赖项。然而,这可能会因为运行本身install可能需要依赖关系而变得更加复杂。在 Python 包中指定它的标准方法是将参数传递给. 顺便说一句,将运行足以发现,安装这些依赖项,然后返回并执行setup_requiressetuptools.setupsetuptoolspipsetup.pysetup_requiressetup.py再次。当然,这是疯狂的,setup_requires永远不应该使用。

一旦pip有了需求列表,它就会为每个所需的包重新开始整个过程​​,同时考虑到对其版本的任何限制。它以这种方式构建一个完整的包树,直到它找到的每个分发的每个依赖项都已经在树中。如果存在依赖循环,这个过程当然会中断,但它总是会终止——毕竟,python 包的数量是有限的!

但是,如果其中一个发行版pip发现违反了另一个发行版的要求,例如,如果它pip首先找到idna版本2.5,然后发现一个发行版需要,会发生idna<=2.4什么?好吧,它忽略了要求并安装idna!有一个长期存在的问题要添加一个真正的依赖解析器,pip有很多错误的开始和部分实现,但没有一个完全成功。这当然在很大程度上是由于确定 python 的依赖关系的复杂性包——在确定单个的依赖关系时,构建一个有效的依赖解析器是非常困难的候选人需要下载和执行潜在的兆字节代码!

接下来pip必须实际构建和安装包。如果它下载了一个源代码分发wheel包并安装了该软件包,它将首先从源代码中专门为您的机器构建一个二进制轮。然后它需要确定安装包的库目录——系统的、用户的还是虚拟环境的?这是由 控制的sys.prefix,而后者又由pip的可执行路径PYTHONPATH和PYTHONHOME环境变量控制。最后,它将wheel文件移动到适当的库目录中,并将python源文件编译为字节码以加快执行速度。

当在命令行输入"pip install xxx"的更多相关文章

  1. 安装需要的第三方库时,命令行输入pip提示不是内部或外部命令

    简介 在做Python开发时,安装需要的第三方库时,大多数人喜欢选择在命令行用pip进行安装. 然而有时敲入pip命令会提示‘pip’不是内部或外部命令..如图: 解决办法 1.在python安装目录 ...

  2. Windows命令行中pip install jieba,但没有安装到anaconda3中

    系统混淆了python3环境下的pip和anaconda3环境下的pip. 找到Anaconda3的Scripts目录,我这里是C:\Users\Diane\Anaconda3\Scripts 将该目 ...

  3. 在命令行已经pip install flask-script,但是导包时出错

    问题:(已经安装好了flask-script,但是导入不成功) 然后在代码中导入相应的包:(报红) 后来发现是在自己创建项目的时候勾选的是创建的是在虚拟环境下的项目,所以环境有问题 所以我应该在虚拟环 ...

  4. 使用python pip安装工具组件包:出现 requests File “<stdin>",line 1 pip install xxx ^ SyntaxError:invalid syntax

    最近想要试试python ,软件安装完成了,但是,import 组件包时,出了问题,一直不得解:安装pycharm 工具感觉麻烦,不想安装那些,只想单纯使用python . 问题复现: 1.Windo ...

  5. Java命令行输入求和的简单学习

    思想:命令行输入的参数,必须先转换为数字才能进行加法计算,这就需要引用java.util.Scanner; 流程框图: 源代码: //实现几个整数相加的程序 //高开拓,2015.9.26 packa ...

  6. PyCharm命令行输入

    PyCharm命令行输入 写作原因 网上资料比较杂,版本较老,与现在的版本有区别,所以根据网上资料和自己亲手实验撰写此文. 设置方法 在菜单中按此路径设置: Run->Edit Configur ...

  7. Linux 命令行输入

    这几天刚刚接触到Linux,在windows上安装的VMWare虚拟机,Centos7.安装什么都是贾爷和办公室的同事帮忙搞定的. 在虚拟机界面,按快捷键Ctrl+Alt+Enter,可以全屏显示Li ...

  8. 在命令行输入python出现“Warning:This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.

    [现象] 在命令行输入python出现“Warning:This Python interpreter is in a conda environment, but the environment h ...

  9. TensorFlow 1.2.0新版本完美支持Python3.6,windows在cmd中输入pip install tensorflow就能下载应用最新tensorflow

    TensorFlow 1.2.0新版本完美支持Python3.6,windows在cmd中输入pip install tensorflow就能下载应用最新tensorflow 只需在cmd中输入pip ...

随机推荐

  1. 【GPLT】 集合相似度(c++)

    题目如下: 这题主要用来练习stl的使用,是一道比较简单的题目 AC代码如下 #include<iostream> #include<cmath> #include<ma ...

  2. Python技法:实现简单的递归下降Parser

    1. 算术运算表达式求值 在上一篇博文<Python技法:用re模块实现简易tokenizer>中,我们介绍了用正则表达式来匹配对应的模式,以实现简单的分词器.然而,正则表达式不是万能的, ...

  3. 华硕主板安装Ubuntu双系统无法启动解决办法

    问题描述: 在安装完Ubuntu后,开机后没有启动项可以选择,而是直接进入win10系统. 解决办法: 开机进入bios,选择 高级模式 (Advance model),进入 启动(boot)选项卡, ...

  4. 团队Arpha4

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...

  5. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  6. wsgiref模块,动静态网页,jinja2模块,django

    基于wsgiref模块搭建服务端 from wsgiref import simple_server def run(request, response): """ :p ...

  7. 一起看 I/O | Flutter 3 正式发布!

    作者 / Tim Sneath, Google Flutter 和 Dart 产品组产品经理 Flutter 3 实现了 Flutter 以移动端为中心扩展到多平台的产品规划,并在今年 I/O 大会的 ...

  8. vue-router实现原理及简易demo

    自定义路由demo,git地址: git@github.com:xsk-walter/Vue-router.git 一.router基本使用 ① 创建和路由相关的组件 ②Vue.use(vueRout ...

  9. leetcode 524. Longest Word in Dictionary through Deleting 通过删除字母匹配到字典里最长单词

    一.题目大意 https://leetcode.cn/problems/longest-word-in-dictionary-through-deleting 给你一个字符串 s 和一个字符串数组 d ...

  10. OpenWrt 20.02.2 小米路由器3G配置CP1025网络打印

    家里的施乐 CP116w 工作快五年了终于罢工了. 黑粉报错, 自己也不会拆, 只能搁置了. 后来换了个 HP CP1025. 这个打印机也不错, 墨盒便宜没什么废粉, 就是启动慢一点, 而且 -- ...