我想正式删除我维护的程序的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,我就不会认为这很重要。
答案 0 :(得分:5)
从setuptools 24.2.0(2016-07-20)和pip 9.0.0(2016-11-02)开始,python_requires
中setup()
的{{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.')