分发需要最低Python版本的Python包的最佳方式是什么

11 投票
2 回答
914 浏览
提问于 2025-04-17 03:34

我有一个Python 2的项目('foo 0.1.7'),需要Python 2.4或更高版本。

现在我把它移植到了Python 3('foo 0.2.0'),这样做的目的是让它仍然能兼容Python 2,但现在的要求提高到了Python 2.6或更高版本。

  • 我知道在setup.py中有一个--target-version=2.6的选项,可以和upload一起使用,但这似乎并不是指'2.6或更高'的意思。
  • 还有setup命令中的install_requires选项,但这个是用来指定需要的包,而不是Python解释器的版本。

我可以在'foo 0.2.0'的setup.py中做一些这样的事情:

if sys.hexversion < 0x02060000:
    raise RuntimeError('This package requires Python 2.6 or later, try foo 0.1.7')

但我更希望easy_install foo能够以某种方式解决这个问题。

那么,我应该如何在PyPI上发布这个呢?

2 个回答

4

我知道在setup.py里有一个--target-version=2.6的选项,可以和上传一起使用,但这似乎并不是指“2.6或更高版本”。

其实这个选项是给bdist_wininst或bdist_msi用的,确实不包括“或更高版本”。

setup命令有一个install_requires选项,但这个是用来指定需要的包,而不是Python解释器。

也许在install_requires里写上'Python >= 2.6'会有效:Python 2.5到3.2会创建一个Python-blahblah-pyXY.egg-info文件,所以如果你运气好,easy_install可能会发现这个要求已经满足。如果没有,它可能会尝试从PyPI下载,所以呃……

我可以在'foo 0.2.0'的setup.py里做类似这样的事情: if sys.hexversion < 0x02060000: raise RuntimeError('这个包需要Python 2.6或更高版本,请尝试foo 0.1.7')

这其实是现在比较常见的做法。此外,使用“Programming Language :: Python :: X.Y”这样的分类标签可以给人类提供信息(我不知道有没有工具会用到这些信息)。

在短期内,还是有希望的。Python分发元数据的规范已经更新,最新版本确实包含了一个字段,可以要求特定的Python版本:http://www.python.org/dev/peps/pep-0345/#requires-python

关于工具支持:distutils已经停止更新,不会支持这个功能,setuptools可能会添加支持,也可能不会,它的分支distribute可能会获得支持,而distutils2/packaging已经支持这个功能。distutils2包括一个叫pysetup的基本安装程序,它应该会尊重Requires-Python字段(如果没有,请报告到bugs.python.org)。

现在,针对你目前的问题,你可以做以下几件事: - 声明你的项目只支持2.6及以上版本 - 说明2.4用户在下载时需要固定版本(例如,pip install "foo==0.1.7")

2

听起来你想要的是一种方法,可以同时上传你程序的0.1.7和0.2.0版本,并让easy_install-2.5自动使用0.1.7版本,而easy_install-2.6则使用0.2.0版本。

如果是这样的话,我不太确定在现有系统下是否能做到……目前最好的选择可能是raise RuntimeError()这个检查;这样安装你项目的人就得手动输入easy_install-2.5 -U "proj<0.2",或者类似的命令。

不过,有一个专门的团队正在努力用一个叫packaging的新库来替代distutilssetuptools等。这种新库结合了现有的distutils增强库的功能,还有很多其他的改进。它计划在Python 3.3中加入,然后再作为distutils2回溯到之前的版本。

特别与你的问题相关的是,它包含了许多对设置元数据的增强;包括一个“requires_python”选项,这似乎正好可以用来指明你想要的信息。不过,我不太清楚他们打算如何利用这些信息,以及这是否会让新的设置系统像你想要的那样工作。

我建议你去打包的联盟这个谷歌小组发帖,那里专门讨论新系统的开发,他们能给你关于requires_python应该如何工作的详细信息……如果可行的话,可能还会在新系统的初期就实现你想要的安装行为(如果这还没实现的话)。

撰写回答