是否有一种标准方法来声明不支持旧的python版本?

时间:2014-10-18 07:44:54

标签: python

我想正式删除我维护的程序的python 2支持并充分利用python 3的功能。我没有让一个程序或多或少在python 2下运行但在极端情况下出现奇怪的行为,我想用一个明确的&#34来正式破解我的python 2程序;请使用python 3代替& #34;错误信息。对于不支持的python版本,最合理的失败方法是什么?

例如,我想在python 2(至少是顶级软件包)中导入代码来触发错误,并且我的distutils setup.py脚本在尝试安装或构建它时出错python 2(即使通过python 3调用,如python3 setup.py sdist_dsc --with-python2)。我还希望包含任何相关的元数据来正式声明我支持哪些python版本。 PEP 345中有一个Requires-Python字段,但如果我没有使用distutils2,我就不会认为这很重要。

3 个答案:

答案 0 :(得分:5)

从setuptools 24.2.0(2016-07-20)和pip 9.0.0(2016-11-02)开始,python_requiressetup()的{​​{1}}参数将告诉我包装工具不安装与说明符不匹配的包。例如,仅支持Python 3.6 +:

setup.py

仅支持Python 2.7和3.4 +:

setup(
    ...
    python_requires=">=3.6",
    ...
)

鉴于内置支持,不应再使用此答案中的以下方法。


要防止导入,请将其放在模块的顶部:

setup(
    ...
    python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
    ...
)

要阻止安装,请将其放在import sys if sys.version_info[0] < 3: raise ImportError('Python < 3 is unsupported.')

的顶部
setup.py

如果使用与Python 2不兼容的语法,在检查之前也会失败,因为模块将在运行之前进行解析。检测那些支持&#34;不支持Python 2&#34;。

可能有点过分

但我实际上并没有在实践中看到过这种情况。大多数维护者只是说支持什么,而不是太烦人。

答案 1 :(得分:3)

标准方法是在classifiers中设置setup.py

if sys.version_info < (3, 3):
    sys.exit("error: this script requires Python 3.3 or greater.")

setup(...,
classifiers=[
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        # ... other non-version info
    ],
    ...)

例如,tulip project (asyncio) supports only Python 3.3

您还可以添加包__init__.py

if sys.version_info < (3, 3):
    raise ImportError("Python 3.3 or greater is required")

答案 2 :(得分:2)

我会选择this answer,但我会提出异常:

import sys

if sys.version_info[0] < 3:
    raise ImportError('Only Python 3 is supported.')