【问题标题】:Can I use Wheel to ship a Python 3.x package to 2.7 if the source code is translatable but the setup is not?如果源代码可翻译但设置不可翻译,我可以使用 Wheel 将 Python 3.x 包发送到 2.7 吗?
【发布时间】:2021-10-06 22:22:20
【问题描述】:

我正在构建一个 Python 包,我希望它可以在 Python 2 和 3 之间进行互操作。

在源代码目录中,我只使用可以在 2.7 和 3.x 中运行的代码,但是,在包定义级别(例如 setup.py)我并不真正关心互操作性并且正在使用更现代的模块,不一定向后兼容 setuptools 和 pathlib

据我所知,setup.py 被执行一次 pip installsa 模块,但是,在本地安装我的包后需要源代码中 setup.py 的某些内容,我观察到与功能相关的代码无法访问仅在包定义所在的父目录中可用的信息,这让我相信这些是抽象的。

如果我使用wheel 将包构建为 Python 2.7 可执行文件,我是否可以期望任何下载它的人都可以在 2.7 版中运行它而无需任何麻烦?

如果不是,我的策略应该是什么?

【问题讨论】:

  • 也许你可以让setup.py 成为一个瘦包装器,在运行时引入真正的 2.7 或 3.x 代码
  • 所以我会根据版本有条件地执行setup.py内的一些代码块?像 wheel 这样的包构建器将如何响应它? setup.py 中的软件包有条件安装可以达到同样的目的吗?
  • 我想如果有人尝试从 源代码分发版 (sdist) 在 Python 2.7 下安装您的项目,这会中断,但从 轮子。因为从 sdist 安装确实会触发 setup.py 的执行,而从轮子安装不会(轮子分发档案甚至不包含 setup.py 文件)。一般建议始终至少分发sdist。所以我认为你真的应该让你的setup.py 与所有目标 Python 解释器版本兼容(所以它应该与 Python 2.7 兼容)。
  • @sinoroc 似乎回答了这个问题。如果您将此添加为答案,我会将其标记为已解决。

标签: python-3.x python-2.7 pypi python-packaging python-wheel


【解决方案1】:

我想如果有人尝试从“源代码分发版 (sdist)”在 Python 2.7 下安装您的项目,这会中断,但从“wheel”安装时会很好”。因为从 sdist 安装确实会触发安装脚本 (setup.py) 的执行,而从轮子安装则不会(轮子分发档案甚至不包含安装脚本)。出现这种情况是因为您的“构建后端”似乎是 setuptools,而其他构建后端的行为可能会有所不同。

无论如何,Python 打包生态系统中的一般建议是始终至少分发 sdist。

所以我认为你真的应该让你的setup.py 与所有目标 Python 解释器版本兼容(所以你应该让它与你的情况下的 Python 2.7 兼容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2017-06-28
    • 2011-03-09
    • 2023-04-10
    • 2016-03-08
    • 2019-07-26
    • 2023-03-28
    相关资源
    最近更新 更多