RFC 77:放弃对Python2的支持,转而支持Python3.6

作者:

伊丹米亚拉

联系方式:

idan@miara.com

起动:

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月)和更新版本上。

https://docs.python.org/3.6/using/mac.html.

哪个版本应该是新的最低版本?

此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实施