angular7.2构建包如何兼容ie_Python 小技巧:如何实现操作系统兼容性打包?

转自:Python猫7e263576ed68c6e11839de93bc958ebd.png

有一个这样的问题:现要用 setuptools 把一个项目打包成 whl 文件,然后 pip install 在 Windows/Linux 两种操作系统上,但是该项目中有一些依赖库只有 Windows 上才有(例如 pywinauto、pywingui、pywinrm),那么问题是,如何实现打包文件的可兼容性安装?

从打包的角度,这个问题的关键还是看 setup.py 和 requirements.txt 文件。

关于 Python 的包构建分发和 setup.py 的使用,这里有篇文章 写得很好,推荐阅读。另外关于 Python 依赖库的管理(requirements.txt),这篇文章 详细比较了 pip、pipreqs、pigar、pip-tools 和 pipdeptree 等工具,也推荐一读。

有一个比较笨的实现方法:维护两份 requirements.txt 文件,分别用来打包,然后分发给不同操作系统去使用。

但是这样会有麻烦:维护两份依赖文件和两种包文件,本身就挺费劲的,而在生成过程中,每次还得对它们改名以作区分(注意包名有一定的规范约束,乱改的话,pip 可能识别不出),维护成本就很高。

其实,维护软件包在不同操作系统的版本,并不少见。如果你曾留意过不同版本 Python 库文件的话,你会注意到很多库都会按不同操作系统而分发不同的版本。例如,下面是同一版本号的 Numpy 在不同操作系统上的分发版(https://pypi.org/simple/numpy/):

a51cf5b082203483063aa377b3fb6c1a.png

可以看出它根据 macos、linux 和 win 三类操作系统及其位数,分成了 5 个版本。维护这么多版本,肯定是一件麻烦事,但是出现了这样的结果,就意味着 Numpy 官方认为分发不同系统版本是利大于弊的,而且是有办法实现的。

回到我们的问题,是否有必要像 Numpy 那样设法打包成多个操作系统定制的包呢?

答案是否定的。主要的原因:
  • Numpy 这么做是因为它是做科学计算的,为了提升效率,它把编译好的 C 拓展文件打包,从而不需要依赖环境上的 libxxx-devel 之类的库。如果你编译安装过 Python,应该有印象需要安装 zlib-devel、openssl-devel 和 libffi-devel 之类的系统依赖。但我们前面的问题比较简单,并不是有不同的编译依赖(系统级),而只是三方库依赖不同(项目级)。

  • 另一个主要的原因,Numpy 打包出的不同系统版本,并非简简单单地用 setuptools 之类的 Python 库就能打包,而是要借助标准的镜像进行构建。例如,manylinux 版本的打包,参见 Github(https://github.com/pypa/manylinux),就需要使用官方提供的 Docker 镜像。对于我们的问题,显然不想做到这么麻烦。

简而言之,根据前面的分析,如果要实现操作系统兼容的打包,维护多份依赖文件、使用不同构建包的方法、维护多系统专用的包,方法可行,但并不是很适用。

如果没有新的办法,这不失为一种考虑,但是有没有别的办法了呢?

我曾被这个问题困扰过,但是没有深入去研究解决,直到无意中在loguru 这个用来记录日志的库的 setup.py 中看到:

cb9ccf982e6d9b0f7ae2888c47137313.png

再翻看大名鼎鼎的requests 库文件,发现还可以这样写:

af8b6e558049229451c13e1e6109eae0.png

两个示例都是写在 setup.py 文件中,其实如果我们用 requirements.txt 文件,也可以按这种格式写,然后再读取进来。

这种神奇的写法是怎么回事呢?

它的依据是 2015 年 11 月创建的 PEP-508(以及相关的但已被撤销或拒绝了的 PEP-390、PEP-426、PEP-459、PEP-496),该 PEP 的主要意图是增强 pip 等工具查找软件包的能力。

c33ec05f511c61500f1679b6494d834e.png

比较重要的部分就是跟我们的问题相关的,即对操作系统作区分的标识,相关的有:

456f50c9d2f3fc5ca254de551780c7fd.png

有了这样的扩展支持,在打包依赖项时,就可以解决兼容性问题了。

例如 colorama 库,如果我们只在 win32 系统才需要依赖,那么在打包时就可以指定:“colorama>=0.3.4 ; sys_platform=='win32' ”;如果不需要限定 win32 系统,而是在 windows 环境都安装,那么可以写成“colorama>=0.3.4 ; platform_system=='Windows' ”。

最终,我们解决了本文开头的问题。这个问题可能比较小众,解决起来也没有什么大文章可做,算是一个小小的 tips 分享给大家吧。感谢阅读7536e40e19ba821abf43ae017c16dcd8.png

推荐阅读:

1:真实的上海IT圈:张江男vs漕河泾男

2:真实的北京IT圈:后厂村姑 vs 后厂村花?

3:为什么你的提问没人解答?

4:Python爱好者社区历史文章合集

8ecc1c49ba9854799246dd1b705e29dd.png

4ac59d7ff49f77ec1df1402992c6951d.png好看请点这里~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云ET工业大脑发布AI视觉产品“见远”:电池片、车辆、路面都能被“诊断”

摘要: 7月24日,阿里云ET工业大脑发布AI视觉产品“见远“,可以利用深度学习和图像处理算法,自动识别图像中的瑕疵、故障及其他目标物,大幅节省人力,提高产品生产效率及精度稳定性效果。 7月24日&#xff0c…

最后2天,BDTC 2019 早鸟票即将售罄,超强阵容及议题抢先曝光!

大会官网:https://t.csdnimg.cn/U1wA2019 年12月5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的 2019 中国大数据技术大会,将于北京长城饭店隆重举行。届时&#xf…

利用python做一个小游戏_如何使用python做一个简单的猜数字的小游戏

1 首先小编先打开IDLE,如下图:2 然后这里点击菜单栏的File,然后点击菜单"New File",如下图:3 然后我们就在idle中新建了一个python文件,如下图:4 在这里我们按照下图中代码输入到文件…

阿里HBase的数据管道设施实践与演进

摘要: 大数据生态下有着丰富多样的系统:流计算,数据存储,实时分析,离线计算,数据在各个异构系统之间的流转和加工而产生价值,高效的数据传输通道是大数据生态的重要一环。本文描述了阿里HBase团…

gradle官方文档_Spring Boot+Gradle+MyBatisPlus3.x搭建企业级的后台分离框架

你再主动一点点 我们就有故事了原文:toutiao.com/i68614564967402706041、技术选型解析器:FastJSON开发工具:JDK1.8 、Gradle、IDEA技术框架:SpringBoot 2.1.5.RELEASEORM技术:MyBatisPlus3.1.2数据库:My…

java random用法_JAVA面试题(1)

1.Java内部类和子类之间有什么区别?答案:内部类是指在一个外部类的内部再定义一个类,内部类对外部类有访问权限,可以访问类 中定义的所有变量和方法。子类是从父类(superclass)中继承的类,子类可以访问父类所有public和…

【不了解你就OUT了】云原生基本原则

戳蓝字“CSDN云计算”关注我们哦!作者 | 架构师技术联盟责编 | 阿秃云原生指的是一个敏捷的工程团队,遵循敏捷的研发原则,使用高度自动化的研发工具,开发基于云基础设施和服务的应用以满足快速变化的客户需求。这些应用采用弹性&…

如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例

摘要: GC一直是Java应用中讨论的一个热门话题,尤其在像HBase这样的大型在线存储系统中,大堆下(百GB)的GC停顿延迟产生的在线实时影响,成为内核和应用开发者的一大痛点。 过去的一年里,我们准备在Ali-HBase上突破这个被…

会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?

JVM应该可以算Java中最为核心的部分了,其中开箱即用的内存管理又是JVM中的核心组成部分。我们都知道JVM的内存管理具有垃圾回收功能(Java Garbage Collector),编码时只需要new而无需主动的释放(类似于C中的delete操作),所以Java中比较少出现内…

看了三张照片,这个AI只用20分钟破获六年“悬案”

摘要: 浙江实现首个AI破案:钱某某夫妇在衢州“国字号”水利风景区信安湖使用“电鱼”方式偷了六年鱼,但由于缺少证据始终无法定罪,然而最终没有逃过衢州城市大脑的AI神眼。 近日,浙江实现首个AI破案:钱某某…

c语言 异或_编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)

你背或者不背,干货就在那里,不悲不喜你学或者不学,编程就在那里,不来不去听到这话的你是否略感扎心?01基础知识1. 计算机系统的主要技术指标与系统配置。2. 计算机系统、硬件、软件及其相互关系。3. 微机硬件系统的基本…

oracle中如何创建表的自增ID(通过序列)

1、什么是序列呢?序列是一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主码值。一个序列的值是由特别的Oracle程序自动生成,因而序列避免了在运用层实现序列而引起的性能瓶颈。Oracle序列允许同时生成多个序列号,而…

反转!以视频搜视频,这批 AI 程序员要逆天了!

抖音AI火了!以图搜图,已经无法满足我们了。近期抖音新功能以视频搜视频上新,不知小姐姐叫什么,也能搜出她的影像!比如,你捕捉了一只可爱的妹子,想要看到更多她的影像,只要点一下“识…

阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

摘要: 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态。在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并…

excel三维地图数据源引用无效_Excel函数公式应用的基础,数据源的引用,动图解释...

一、数据源的相对引用公式的使用就是对数据源的引用,默认使用相对引用方式。采用这种方式引用的数据源,当将公式复制到其他位置时,公式中的单元格地址会随着变化。方法:1、选中C2单元格,在公式编辑栏中可以看到该单元格…

一份帮助你更好地理解深度学习的资源清单

摘要: 深度学习朝着可解释的方向发展,理解背后的基本原理显得更加重要。本文是一份帮助读者更好地理解深度学习基本过程的清单,便于初学者和部分起步者针对性地补充自己的知识体系。 人工智能和深度学习太火了,火得一塌糊涂&#…

python 按条件选择行和列数据_小白学数据结构-排序算法Python(冒泡、选择、快速、希尔等等)...

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内…

【戳进来有福利】|【技巧帖】3个Tips提升云性能

戳蓝字“CSDN云计算”关注我们哦!作者 | David Linthicum转自 | InfoWorld翻译 | 孔子东游责编 | 阿秃当企业遭遇云计算性能瓶颈时,一般人能想到的而且是最简单的办法,就是针对那些表现不佳的工作负载来增加可用的资源数量。具体来说&#x…

目标检测技术演化:从R-CNN到Faster R-CNN

摘要: 一文了解目标检测技术发展,不要错过哟。 目标检测旨在准确地找到给定图片中物体的位置,并将其正确分类。准确地来讲,目标检测需要确定目标是什么以及对其定位。 然而,想要解决这个问题并不容易。因为&#xff…

关于解决jdbc版本错误问题

关于解决jdbc版本错误问题 最近在做一个项目,在使用IDEA测试某个接口时出现了这个异常: 然后百度了一下发现很多都说是mysql-connector-java.jar包版本不一样,或者是jdbc.properties文件内容出错。 一定要仔细检查自己的数据库名跟账户密码…