【发布时间】: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