我有一个需要Python 2.4或更高版本的Python 2项目('foo 0.1.7')。
现在我将它移植到Python 3('foo 0.2.0'),它仍然与Python 2兼容,但现在要求已经提升到Python 2.6或更高版本。
--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上部署它?
答案 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
的更新库替换setuptools
,packaging
等。这个新库结合了现有distutils增强库的功能,以及许多其他改进。它将被包含在Python 3.3中,然后被反向移植为distutils2
。
与您的问题特别相关,它包含许多设置元数据的增强功能;包括一个"requires_python"选项,它似乎是为了准确指出您想要的信息而定制的。但是,我不确定他们打算如何使用这些信息,如果它会导致新的设置系统表现得像你想要的那样。
我建议发布到致力于新系统开发的Google小组the fellowship of the packaging,他们可以详细说明requires_python
应该如何运作...以及可能如果它看起来可行(并且还没有),那么在新系统的底层获得你想要的安装行为。