有一个这样的问题:现要用 setuptools 把一个项目打包成 whl 文件,而后 pip install 在 Windows/Linux 两种操做系统上,可是该项目中有一些依赖库只有 Windows 上才有(例如 pywinauto、pywingui、pywinrm),那么问题是,如何实现打包文件的可兼容性安装?linux
从打包的角度,这个问题的关键仍是看 setup.py 和 requirements.txt 文件。git
关于 Python 的包构建分发和 setup.py 的使用,这里有篇文章 写得很好,推荐阅读。另外关于 Python 依赖库的管理(requirements.txt),这篇文章 详细比较了 pip、pipreqs、pigar、pip-tools 和 pipdeptree 等工具,也推荐一读。github
有一个比较笨的实现方法:维护两份 requirements.txt 文件,分别用来打包,而后分发给不一样操做系统去使用。macos
可是这样会有麻烦:维护两份依赖文件和两种包文件,自己就挺费劲的,而在生成过程当中,每次还得对它们更名以做区分(注意包名有必定的规范约束,乱改的话,pip 可能识别不出),维护成本就很高。windows
其实,维护软件包在不一样操做系统的版本,并很多见。若是你曾留意过不一样版本 Python 库文件的话,你会注意到不少库都会按不一样操做系统而分发不一样的版本。例如,下面是同一版本号的 Numpy 在不一样操做系统上的分发版(pypi.org/simple/nump…):工具
能够看出它根据 macos、linux 和 win 三类操做系统及其位数,分红了 5 个版本。维护这么多版本,确定是一件麻烦事,可是出现了这样的结果,就意味着 Numpy 官方认为分发不一样系统版本是利大于弊的,并且是有办法实现的。ui
回到咱们的问题,是否有必要像 Numpy 那样设法打包成多个操做系统定制的包呢?操作系统
答案是否认的。主要的缘由:3d
简而言之,根据前面的分析,若是要实现操做系统兼容的打包,维护多份依赖文件、使用不一样构建包的方法、维护多系统专用的包,方法可行,但并非很适用。日志
若是没有新的办法,这不失为一种考虑,可是有没有别的办法了呢?
我曾被这个问题困扰过,可是没有深刻去研究解决,直到无心中在loguru
这个用来记录日志的库的 setup.py 中看到:
再翻看大名鼎鼎的requests
库文件,发现还能够这样写:
两个示例都是写在 setup.py 文件中,其实若是咱们用 requirements.txt 文件,也能够按这种格式写,而后再读取进来。
这种神奇的写法是怎么回事呢?
它的依据是 2015 年 11 月建立的 PEP-508(以及相关的但已被撤销或拒绝了的 PEP-390、PEP-42六、PEP-45九、PEP-496),该 PEP 的主要意图是加强 pip 等工具查找软件包的能力。
比较重要的部分就是跟咱们的问题相关的,即对操做系统做区分的标识,相关的有:
有了这样的扩展支持,在打包依赖项时,就能够解决兼容性问题了。
例如 colorama 库,若是咱们只在 win32 系统才须要依赖,那么在打包时就能够指定:“colorama>=0.3.4 ; sys_platform=='win32' ”;若是不须要限定 win32 系统,而是在 windows 环境都安装,那么能够写成“colorama>=0.3.4 ; platform_system=='Windows' ”。
最终,咱们解决了本文开头的问题。这个问题可能比较小众,解决起来也没有什么大文章可作,算是一个小小的 tips 分享给你们吧。