11

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

现在我将它移植到 Python 3('foo 0.2.0'),但它仍然与 Python 2 兼容,但现在要求提升到 Python 2.6 或更高版本。

  • 我知道--target-version=2.6setup.py 有一个选项,可以与 一起使用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 上部署它呢?

4

2 回答 2

4

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

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

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

也许将“Python >= 2.6”放在 install_requires 中可能会起作用: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('This package requires Python 2.6 or later, try foo 0.1.7')

这其实是现在的常用成语。此外,使用“Programming Language :: Python :: XY”分类器将为人类提供信息(我不知道有任何工具使用该信息)。

短期内,还是有希望的。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" )

于 2011-10-09T09:44:31.793 回答
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"或类似的东西。

也就是说,目前有一个专门的小组正在努力distutilssetuptools一个名为packaging. 这个新库结合了现有 distutils 增强库的功能以及许多其他改进。它计划包含在 Python 3.3 中,然后被反向移植为distutils2.

与您的问题特别相关,它包含对设置元数据的许多增强;包括一个“requires_python”选项,它似乎是量身定制的,可以准确地指示您想要的信息。但是,我不确定他们打算如何使用这些信息,以及它是否会导致新设置系统的行为如您所愿。

我建议张贴到包装的研究小组,致力于开发新系统的谷歌小组,他们将能够提供有关requires_python应该如何工作的详细信息......并可能获得您想要的安装行为新系统的底层,如果它看起来可行(并且还没有)。

于 2011-10-03T17:37:13.940 回答