分发需要最小Python版本的Python包的最佳方法是什么

时间:2011-10-03 11:20:33

标签: python setuptools pypi

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

现在我将它移植到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 个答案:

答案 0 :(得分:4)

  

我知道setup.py有一个--target-version = 2.6选项,可以   与上传一起使用,但似乎不是“2.6或更高”

它实际上是bdist_wininst或bdist_msi的一个选项,实际上不包括“或更高”。

  

setup命令有一个install_requires选项,但这是必需的   包,.not Python解释器。

也许在install_requires中放置'Python&gt; = 2.6'可以工作:Python 2.5到3.2创建一个Python-blahblah-pyXY.egg-info文件,所以如果你很幸运,easy_install可能会发现满足要求。如果没有,它可能会尝试从PyPI下载,所以呃......

  

我可以在'foo 0.2.0'的setup.py中执行类似的操作:   if sys.hexversion&lt; 0x02060000:      提高RuntimeError('此包需要Python 2.6或更高版本,请尝试foo 0.1.7')

这实际上是当前常见的习语。此外,使用“编程语言:: Python :: X.Y”特洛伊分类器将为人类提供信息(我不知道使用该信息的任何工具)。

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

关于工具支持:distutils被冻结并且不支持它,setuptools可能会或可能不会添加支持,它的fork分发可能会获得支持,而distutils2 / packaging已经支持它。 distutils2包含一个名为pysetup的基本安装程序,它应该遵循Requires-Python字段(如果没有,请向bugs.python.org报告)。

现在,要解决您的问题,您可以执行以下操作之一: - 声明您的项目仅支持2.6+ - 下载时2.4用户需要固定版本的文件(例如pip install“foo == 0.1.7”)

答案 1 :(得分: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"或类似的东西。

也就是说,目前有一个专门小组正在使用名为distutils的更新库替换setuptoolspackaging等。这个新库结合了现有distutils增强库的功能,以及许多其他改进。它将被包含在Python 3.3中,然后被反向移植为distutils2

与您的问题特别相关,它包含许多设置元数据的增强功能;包括一个"requires_python"选项,它似乎是为了准确指出您想要的信息而定制的。但是,我不确定他们打算如何使用这些信息,如果它会导致新的设置系统表现得像你想要的那样。

我建议发布到致力于新系统开发的Google小组the fellowship of the packaging,他们可以详细说明requires_python应该如何运作...以及可能如果它看起来可行(并且还没有),那么在新系统的底层获得你想要的安装行为。