当输入"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. 初踩坑JS加载与audio接口:点击头像开始/暂停背景音乐

    背景 封楼期间难得空闲,也静不下心学习,空闲之余萌生了重做引导单页的想法.因为之前都是扒站(某大公司游戏官网)+小改,一来虽然很炫酷,但本人水平有限,仍有很大一部分JS无从下手,甚至是看不懂|-_-| ...

  2. arduino 天下第一(暴论) -- 智能猫眼与 SDDC 连接器移植到 arduino 上

    前言 之前看了官方玩过一个智能猫眼摄像头,我很有兴趣,但是那个 IDF 平台属实难整,我光安装都整了一天,网不好下载的包可能有问题.然后命令行操作也比较麻烦,我就想到了无敌的 arduino ,ESP ...

  3. Markdown学习-Typora

    author:涂勇军 标题 (#加一个空格)一级标题 (##加一个空格)二级标题 (###加一个空格)三级标题 (####加一个空格)四级标题 字体 加粗:** hello,World **(快捷键是 ...

  4. ASP.NET Web 应用 Docker踩坑历程

    听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...

  5. Tensorflow 窗口时间序列数据的处理

    Tensorflow 时间序列数据的处理 数据集简介 数据来源:Kaggle Ubiquant Market Prediction 数据集描述了多个投资项目在一个时间序列下的300个匿名特征(&quo ...

  6. 数据结构_C语言_单链表

    # include <stdio.h> # include <stdbool.h> # include <malloc.h> typedef int DataTyp ...

  7. [python][flask] Flask 入门(以一个博客后台为例)

    目录 1.安装 1.1 创建虚拟环境 1.2 进入虚拟环境 1.3 安装 flask 2.上手 2.1 最小 Demo 2.2 基本知识 3.解构官网指导 Demo 3.1 克隆与代码架构分析 3.2 ...

  8. UART串口及Linux实现

    UART,全称Universal Asynchronous Receiver Transmitter,通用异步收发器,俗称串口.作为最常用的通信接口之一,从8位单片机到64位SoC,一般都会提供UAR ...

  9. 使用python脚本+zabbix前端监控云联网底层TCP数据流所负载的链路质量,并在丢包时联动保存MTR记录

    背景 目前国内各家云联网跨区域数据传输,会将数据流通过哈希运算负载到不同的底层链路上,而底层链路质量差异较大,这种情况导致的现象就是,使用传统的icmp监控线路正常,但是业务一直不稳定,所以才有了使用 ...

  10. c# DirectoryEntry LDAPS

    参考地址:https://stackoverflow.com/questions/54987776/ldap-connection-error-the-server-is-not-operationa ...