当在命令行输入"pip install xxx"
当输入"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"的更多相关文章
- 安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
简介 在做Python开发时,安装需要的第三方库时,大多数人喜欢选择在命令行用pip进行安装. 然而有时敲入pip命令会提示‘pip’不是内部或外部命令..如图: 解决办法 1.在python安装目录 ...
- Windows命令行中pip install jieba,但没有安装到anaconda3中
系统混淆了python3环境下的pip和anaconda3环境下的pip. 找到Anaconda3的Scripts目录,我这里是C:\Users\Diane\Anaconda3\Scripts 将该目 ...
- 在命令行已经pip install flask-script,但是导包时出错
问题:(已经安装好了flask-script,但是导入不成功) 然后在代码中导入相应的包:(报红) 后来发现是在自己创建项目的时候勾选的是创建的是在虚拟环境下的项目,所以环境有问题 所以我应该在虚拟环 ...
- 使用python pip安装工具组件包:出现 requests File “<stdin>",line 1 pip install xxx ^ SyntaxError:invalid syntax
最近想要试试python ,软件安装完成了,但是,import 组件包时,出了问题,一直不得解:安装pycharm 工具感觉麻烦,不想安装那些,只想单纯使用python . 问题复现: 1.Windo ...
- Java命令行输入求和的简单学习
思想:命令行输入的参数,必须先转换为数字才能进行加法计算,这就需要引用java.util.Scanner; 流程框图: 源代码: //实现几个整数相加的程序 //高开拓,2015.9.26 packa ...
- PyCharm命令行输入
PyCharm命令行输入 写作原因 网上资料比较杂,版本较老,与现在的版本有区别,所以根据网上资料和自己亲手实验撰写此文. 设置方法 在菜单中按此路径设置: Run->Edit Configur ...
- Linux 命令行输入
这几天刚刚接触到Linux,在windows上安装的VMWare虚拟机,Centos7.安装什么都是贾爷和办公室的同事帮忙搞定的. 在虚拟机界面,按快捷键Ctrl+Alt+Enter,可以全屏显示Li ...
- 在命令行输入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 ...
- 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 ...
随机推荐
- 最新MATLAB R2020b超详细安装教程(附完整安装文件)
摘要:本文详细介绍Matlab R2020b的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用. ...
- Jx.Cms开发笔记(五)-文章编辑页面标签设计
标签页的样子 设计思路 与其他输入框一样,存在一个Label标签,由于这里不像其他输入框一样可以直接使用Row标签,所以这里需要额外增加. 使用Tag组件显示所有的标签,我们在Blazor 组件库 B ...
- 【虚拟机】VMware-Ubuntu-安装与卸载
VMware-Ubuntu 一.Ubuntu虚拟机安装 1.安装Ubuntu镜像 下载Ubuntu镜像文件,下载地址:http://www.ubuntu.com,点击download 下一步,到如下页 ...
- petite-vue源码剖析-沙箱模型
在解析v-if和v-for等指令时我们会看到通过evaluate执行指令值中的JavaScript表达式,而且能够读取当前作用域上的属性.而evaluate的实现如下: const evalCache ...
- 攻防世界-MISC:Training-Stegano-1
这是攻防世界高手进阶区的题目,题目如下: 点击下载附件一,得到一张bmp图片 尝试用stegslove打开,并没有得到什么有用的信息,用010editor打开,发现文件后面有一串字符串 尝试提交fla ...
- 双列集合Map接口 & Collections工具类
HashMap 常用方法 遍历方式 iterator迭代器 ITIT HashTable 继承字典 Hashtable--Properties 文件读写 总结 Collections工具类
- Halo 开源项目学习(七):缓存机制
基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问.更新的数据存入到缓存.Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存.Redis.LevelDB ...
- Spring 源码(14)Spring Bean 的创建过程(5)
到目前为止,我们知道Spring创建Bean对象有5中方法,分别是: 使用FactoryBean的getObject方法创建 使用BeanPostProcessor的子接口InstantiationA ...
- 【java并发编程】ReentrantLock 可重入读写锁
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可 ...
- zabbix脚本获取web status code,异常告警
python代码,需要安装requests库 1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 import requests,os,sys 4 url ...