RFC 77:放弃对Python2的支持,转而支持Python3.6
作者: |
伊丹米亚拉 |
联系方式: |
|
起动: |
2020年11月3日 |
上次更新时间: |
2020年11月29日 |
状态: |
在GDAL 3.3中采用并实施 |
总结
这个RFC放弃了对python2的支持,并将python3.6设置为新的最低支持Python版本。
动机
目前gdalpython绑定支持python2.7和python3(因此只有这两种绑定的共同点)。Python2已经到了生命周期的尽头,从2020年1月起就不再受支持了。https://www.python.org/doc/sunset-python-2/
“我们不想伤害使用python2的人。因此,在2008年,我们宣布将在2015年推出sunset Python2,并要求人们在此之前进行升级。有些人这样做了,但许多人没有。因此,2014年,我们将日落时间延长至2020年。”
虽然保持对python2.7的支持可能有助于那些在12年的过渡期内没有将代码升级到python3的人,但是这个PR表明时机已经到来,放弃python2支持的好处超过了缺点。几乎所有受支持的操作系统和相关程序都已经使用了python3。此外,大多数通常与GDAL一起使用的相关项目已经放弃了python2的支持(如下所示)。这是有道理的人谁没有升级他们的代码在12年内仍然使用一个更旧的版本的GDAL无论如何。。。
保持python2支持的缺点给GDAL维护人员带来了不必要的维护负担,因为维护人员需要确保他们的新代码与python2向后兼容。此外,在python3中添加的许多重要特性不能在GDAL中使用,以保持与python2的向后兼容性。
Python 3版本状态:
Python3.5(发布时间:2015年9月)已经结束。许多相关项目已经放弃了对它的支持。
Python3.6(发布时间:2016年12月)将于2021年12月结束。Python3.6带来了许多重要特性。
python3.7(发布时间:2018年6月)将于2023年6月结束。python3.7已经被上面列出的所有相关项目广泛采用和支持。
python3.8(发布时间:2019年10月)将于2024年10月结束。Python3.8太新了,不能设置为支持的最低版本。
https://endoflife.date/python#:~:text=The%20support%20for%20Python%202.7,droping%20support%20for%20Python%202.7。
Python 3操作系统支持:
Linux:
分布 |
发布日期 |
生命的终结 |
Python 版本 |
Ubuntu 16.04版本 |
2016年4月 |
2021年4月 |
Python 3.5 |
Ubuntu 18.04仿生LTS |
2018年4月 |
2023年4月 |
Python 3.6(universe中的3.7) |
Ubuntu 20.04版本 |
2020年4月 |
2021年4月 |
Python 3.8 |
Debian 9.0扩展LTS |
2017年6月 |
2022年7月 |
Python 3.5 |
Debian 10.0巴斯特LTS |
2019年7月 |
~2022 |
Python 3.7 |
Centos/RHEL 8号 |
2019年9月 |
是吗? |
Python 3.6(?) |
亚马逊Linux |
2021年12月 |
Python 3.6 |
https://wiki.python.org/moin/Python3LinuxDistroPortingStatus
窗户:
康达:Python 3.6-3.9
geo3.4版本:ospython
内部:Python 2.7、3.4-3.7
MacOS公司:
看起来,即使Python2.7已经预装在Mac OS X上,Python3.5-3.9也可以与Python2一起安装在Mac OS X 10.8(发布日期:2012年7月)和更新版本上。
哪个版本应该是新的最低版本?
此RFC建议新的最低支持Python版本应为3.6,原因如下:
Python<3.6是生命的终结。
- Python3.6中引入的一长串新特性,其中有几个对于简化代码或改进测试非常有用:
F弦
内置路径库
数字文本中的下划线
类型批注
malloc调试
python3.6在几乎所有相关的操作系统中都是现成的。
对于其他相关项目来说,python3.6可能是目前最安全的选择。
python3.7(及更新版本)在一些流行的LTS-Linux发行版中无法无缝地提供。
我们要使过渡尽可能顺利和容易。由于上述原因,将minimum设置为python3.7可能会使CI的转换更加困难。
在未来的版本中放弃python3.6而支持python3.7或更新的版本应该不会像这次放弃那样困难(请参阅下一节中建议的方法)。
GDAL发布周期和Python常规版本
在发布GDAL 3.1.0时,甚至Rouault也建议GDAL在主要版本之间使用6个月的固定发布周期:
http://osgeo org.1560.x6.nabble.com/gdal-dev-referencing-release-cycle-length-td5436163.html#a5436242
根据这一建议,gdal3.3.0应该在2021年4-5月发布。
我们可能会与nep29同步-建议将Python和Numpy版本支持作为社区策略标准。建议何时删除每个Python版本。
https://numpy.org/neps/nep-0029-deprecation_policy.html
nep29建议在2020年6月23日放弃对python3.6的支持(支持python3.7)。
我们可能会讨论类似的/更保守的方法,并将每一个版本的发布时间再推迟几个月,或者只发布已经到了生命周期结束的Python版本(到目前为止,Python<3.6已经到了生命周期结束)。关于删除其他Python版本的进一步讨论是另一个RFC的主题。
向后兼容性
目前,gdalpython代码本身与python2和python3兼容。一旦这个PR被接受,gdal3.3.0将与python2不兼容。因此,任何使用GDAL的“仅python2”代码都需要升级到python3,同时相应的Python解释器需要升级到受支持的Python版本。
GDAL3.2会是LTS吗?
目前-没有。到目前为止,还没有人站出来做一个LTS,所以不会有一个,除非有人采取行动自己或筹集资金使之发生。GDAL只在6个月内提供当前稳定分支的错误修复版本。
CI影响:
应分析对CI的影响。似乎我们所有的CI构建都使用python2.7或3.5,因此需要对它们进行调整。特别是,使用旧的Linux发行版的构建需要升级。
对杏仁核的影响
对GDAL核心应该没有影响,因为Python绑定是由SWIG在GDAL的二进制形式之上生成的。
限制和范围
这个RFC的作用域应该是gdalpython代码。GDAL支持的任何其他语言都不应该受到影响。
SWIG绑定更改
首先,swigpython绑定已经支持python3.6。放弃对python2的支持可能会允许我们使用一个更新的SWIG版本,或者对绑定进行一些改进,但这并不一定是第一步。
安全影响
python3.6是Python的最低版本,它还没有结束,因此仍然会收到安全更新。
性能影响
由于python2.7-3.6之间有许多性能改进,因此对于某些用途,此升级可能会获得一些性能提升。改进的范围可能受到限制,因为大多数GDAL Python代码是围绕C++代码的一个薄薄包装。
文档
GDAL Python文档是在中自动生成的,应该已经支持python3了。如果文档中有特定于python2的部分,则应该删除或重构它们。
测试
升级CI时,应删除或升级Python2测试。应该添加一个在Python<3.6上失败的简单测试。不需要任何额外的测试。
以前的讨论
过去曾在以下文章中讨论过此主题:
投票历史
https://lists.osgeo.org/pipermail/gdal-dev/2020-November/053039.html
+伊文尔、霍华德、库尔茨、朱卡尔、丹尼尔姆各1人
信用
由Even Rouault、Robert Coup和Idan Miara实施