我想正式放弃对我维护的程序的python2支持,并充分利用python3的特性。我不想让程序在python2下或多或少地工作,但在某些情况下会出现奇怪的行为而失败,我想在python2上正式中断我的程序,并给出一个明确的“请使用python3代替”的错误消息。对于不支持的python版本,最合理的失败方式是什么?
例如,我希望在Python2(至少是顶级包)中导入代码以触发错误,并且在尝试为Python2安装或构建它时(即使通过python3 setup.py sdist_dsc --with-python2等Python3调用),我的distutils setup.py脚本也会出错。我还想包括任何相关的元数据,以正式声明我支持哪些python版本。在PEP 345中有一个Requires-Python字段,但如果我不使用distutils2,我认为这无关紧要。
发布于 2014-10-18 15:52:54
从setuptools 24.2.0 (2016-07-20)和pip 9.0.0 (2016-11-02)开始,setup.py中setup()的python_requires参数将告诉打包工具不要安装与说明符不匹配的包。例如,要仅支持Python 3.6+:
setup(
...
python_requires=">=3.6",
...
)只支持Python2.7和3.4+:
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的顶部
import sys
if sys.version_info[0] < 3:
sys.exit('Python < 3 is unsupported.')如果您使用与Python 2不兼容的语法,这也将在检查之前失败,因为模块将在运行之前被解析。检测到这可能是对“不支持Python 2”的支持的夸大。
但我还没有在实践中看到这一点。大多数维护人员只会说支持什么,而不会检查。
发布于 2014-10-18 16:18:48
标准方法是在setup.py中设置classifiers
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")发布于 2014-10-19 01:23:00
我会使用this answer,但是我会抛出一个异常:
import sys
if sys.version_info[0] < 3:
raise ImportError('Only Python 3 is supported.')https://stackoverflow.com/questions/26437467
复制相似问题