Python打包:Wheels与tarball(tar.gz)的区别

58
轮子相对于鸡蛋的优势是显而易见的(请参阅“为什么不使用鸡蛋”https://pypi.python.org/pypi/wheel)。
然而,对于我来说,使用轮子与tar.gz相比有何优势并不完全清楚。 我可能会忽略一些明显的东西,例如“它们是相同的”。 在我的看法中,两者都可以直接使用pip进行安装(即使在Windows中),大小相似,并且在打包时需要类似的工作量。 对我来说,这听起来像是在解释某种打包方法时可能遇到的问题。
编辑: 刚刚发现一个例子,tar.gz可能比轮子更好。CherryPy(https://pypi.python.org/pypi/CherryPy)仅提供Python 3.x的轮子,因此如果您想要拥有本地存储库以为Python 2.7和3.x依赖项服务于CherryPy,则似乎更合理地存储tarball。 这正确吗?(只是为讨论增加了几个“基于案例”的论据)
2个回答

35
这是直接从PEP中得出的结论:Python需要一种比sdist更容易安装的包格式。Python的sdist包由distutils和setuptools构建系统定义,并且需要运行任意代码来构建、安装和重新编译代码,以便将其安装到新的虚拟环境中。这种混合构建-安装的系统速度慢、难以维护,并阻碍了构建系统和安装程序的创新。Wheel试图通过提供一个更简单的构建系统和安装程序之间的接口来解决这些问题。Wheel二进制包格式使安装程序不必了解构建系统,通过将编译时间分摊到许多安装中节省时间,并消除了在目标环境中安装构建系统的需要。

https://www.python.org/dev/peps/pep-0427/#rationale

请注意,我们所说的tarballs是上面提到的“sdists”。

谢谢,我试图阅读setuptools的文档,但是不理解以下句子:“'tests'目录将出现在'sdist'中,但不会出现在'wheel'中”。现在我知道tar.gz文件是sdist,而.whl文件是“wheels”。 - Brian W

12

来自Python Wheels

wheel的优势

• 对于纯Python和本地C扩展包,提供更快的安装速度。
• 避免了在安装过程中进行任意代码执行(避免了setup.py)。
• 在Windows或OS X上安装C扩展不需要编译器。
• 允许更好地缓存用于测试和持续集成。
• 安装时创建.pyc文件以确保它们与使用的Python解释器相匹配。
• 在不同平台和机器上实现更一致的安装。

确保已安装wheel。

python3 -m pip install wheel

2
所有这些点都是tarballs无法做到的吗?(例如,我可以轻松地说,在Linux机器上需要“额外”软件来使用wheels,而tarball则不需要) - zom-pro
2
我并不总是知道tarball里面有什么,即使打开了存档文件,我也不能像知道.whl文件里面有什么那样清楚,.whl文件应该“只需运行”,这对我使用pip来说是一个很大的优势,因为pip经常不能“只需运行”。 - karel
2
你能深入一点讲解这个问题吗?在我看来,当我看到一个轮子和一个tarball时,两者都有打包的软件包和一些额外的打包魔法。即使我可以说,在tarball中,我可以直接看到许可证,而在轮子中找不到它(在商业软件中非常重要)。两者都可能隐藏一些不良内容,这就是为什么我不理解“只需工作”的原因。(顺便说一句,我喜欢轮子,但我需要一个充分的理由) - zom-pro
4
据我所理解,轮子(wheel)中的文件只是被复制到相应的位置。源代码发行版(sdist archive)中的文件会通过 setup.py 进行处理,通常只是将它们复制到某个地方,但不一定只是复制。因此在这个意义上,轮子更加简单。 - Martin Geisler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接