分发需要最低Python版本的Python包的最佳方式是什么
我有一个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 个回答
我知道在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")
听起来你想要的是一种方法,可以同时上传你程序的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
的新库来替代distutils
、setuptools
等。这种新库结合了现有的distutils增强库的功能,还有很多其他的改进。它计划在Python 3.3中加入,然后再作为distutils2
回溯到之前的版本。
特别与你的问题相关的是,它包含了许多对设置元数据的增强;包括一个“requires_python”选项,这似乎正好可以用来指明你想要的信息。不过,我不太清楚他们打算如何利用这些信息,以及这是否会让新的设置系统像你想要的那样工作。
我建议你去打包的联盟这个谷歌小组发帖,那里专门讨论新系统的开发,他们能给你关于requires_python
应该如何工作的详细信息……如果可行的话,可能还会在新系统的初期就实现你想要的安装行为(如果这还没实现的话)。