当输入"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. PyTorch环境配置

    PyTorch环境配置 本文档用于记录PyTorch环境配置过程中的要点. PyTorch环境配置 安装Miniconda 安装PyTorch 配置远程开发工具 基于CUDA的张量 导入警告问题 参考 ...

  2. html_学习所有标签使用

    <!DOCTYPE html><!--声明为HTML5文档--><html lang="en"><head><!-- 页面表头 ...

  3. 开发一款让我们慢慢变好的微信小程序

    1. 前言 朋友,你还记得你想学编程最初的目的是什么吗? 先说说我的吧,我最初想学编程的目的只有一点,感觉编程很酷,会写代码的人很厉害!.随着后面参加工作,我马上产生了让我能够在编程这条路上继续走下去 ...

  4. 『现学现忘』Git基础 — 20、Git中忽略文件补充

    目录 1.忽略文件常遇到的问题 2.忽略文件配置优先级 3.忽略已跟踪文件的改动(本机使用) 4.autocrlf和safecrlf参数说明 (1)提出问题 (2)autocrlf说明 (3)safe ...

  5. MySQL(3) - 数据库表的相关操作

    1.数据库表的创建 逻辑库 1)创建逻辑库:CREATE DATABASE 逻辑库名称; 2)显示逻辑库:SHOW DATABASES; 3)删除逻辑库:DROP DATABASE 逻辑库名称; 数据 ...

  6. 使用python获取交换机syslog日志并使用jQuery在html上展示

    需求 现网有部分pop点独立于海外,无法发送日志给内网日志服务器,同时最近网内有比较重要割接,所以临时写一个脚本来展示网内日志 思路 使用socket接收syslog数据,udp 514,数据部分格式 ...

  7. 我用13行摆烂了你的oj4

    13行代码AC oj4是怎么回事呢?13行代码AC oj4相信大家都很熟悉,但是13行代码AC oj4是怎么回事呢,下面就让小编带大家一起了解吧.13行代码AC oj4,其实就是13行代码AC oj4 ...

  8. 【单片机】CH32V103C8T6 ——窗口看门狗

    本章教程通过串口调试助手打印显示程序运行状态,具体现象如下: 若计数器值在上窗口值和下窗口值0X40之间的时候,进行喂狗操作,计数器重新计数,程序正常运行,串口打印显示:The program run ...

  9. 基于C++11的数据库连接池实现

    0.注意 该篇文章为了让大家尽快看到效果,代码放置比较靠前,看代码前务必看下第4部分的基础知识. 1.数据库连接池 1.1 是什么? 数据库连接池负责分配.管理和释放数据库连接,属于池化机制的一种,类 ...

  10. Activate-or-Not:learning-customized-activation

    关于activate-or-Not的PPT paper code step1 step2 step3 step4 step5 step6 step7 step8 step9 step10