一、前言:
Python 软件基金会宣布,到 2020 年元旦,将不再为编程语言 Python 2.x 分支提供任何支持。这一天将标志着一出延续多年的戏剧的高潮:Python 从较旧的、功能较弱的、广泛使用的版本过渡到更新的、更强大的版本。
然而,Python 的新版本在采用上仍然落后于它的旧版本。未来几年里,还会有很多人继续使用 Python 2 编写的程序,当世界被 Python 3 迅速占领之时,受困于寿命终将终结的 Python 2,你应该怎么办?
二、Python2和Python3
与 Python 2 相比,Python 3 有着无数的技术和最终用户增强功能,但却未能永久取代的了Python 2。
PyPI 存储库中托管的大多数流行包都支持 Python 3(该库是可重用 Python 代码的第一站)。Python 3 现在已经成为许多 Linux 发行版默认的 Python 解释器。大多数最近出版的书籍、编码学院(coding academy)和在线课程都向初学者推荐了 Python 3。
但现在的坏消息是,Python 2,就像 Windows 7(或 Windows XP),在未来的几年里,还将会伴随我们很长时间。
我们中的许多人还将继续依赖于使用 Python 2 编写的应用程序。由于内部限制,我们中的一些人甚至还会继续将 Python 2 用于新的应用程序。如果这个世界正在被 Python 3 迅速占领,而你却受困于 Python2,这该如何是好呢?
三、Python 2 寿命终结意味着什么?
关于 Python 2 走向 EOL(End of Life,寿命终止)的第一件事也是最重要的事情是:Python 2 应用程序仍将运行。
不要认为这是千年虫的问题,Python 2 应用程序并不会在 2020 年 1 月 1 日全部神奇地停止运行。只是核心 Python 开发团队将不再对 Python 2 提供任何官方支持而已。
下面是 Python 2 EOL 在实际应用中的含义:
将不再提供 Python 2 的官方 bug 修复和安全补丁。 核心开发团队将不会修复 Python 2 解释器或 Python 标准库中新发现的问题。 但是,商业供应商可以自己维护 Python 2,而其他第三方可以对 Python 2 代码库进行分 叉,并继续核心团队的工作。(稍后将更详细介绍)
第三方 Python 项目将放弃 Python 2。 而那些同时支持 Python 2 和 Python 3 的库将开始把资源专门投入 Python 3。 这些项目中有许多是志愿者运行的。只支持一种语言版本的话,工作量就要少得多。每个项目都将决定是否支持 Python 2,但许多主要的 Python 2 项目承诺到 2020 年才完全放弃对 Python 2 的支持。
对 Python 2 的平台支持将会减弱。 Linux 发行版和云服务提供商可能会继续包含 Python 2 运行时。但随着时间的推移,预计对 Python 2 的支持将会逐渐减弱。 几乎可以肯定的是,在云平台上仍然可以运行 Python 2 的容器化版本,但是不能保证云服务提供商将继续维护自己的 Python 2 容器。
如果你被困在 Python 应用程序中,那么如何应对缺少 Python 2 支持的情况?从长远来看,最好的办法是找到一种能够消除对 Python 2 所有依赖项的策略。但这只是众多选择中的一个。
四、从 Python 2 过渡到 Python 3
根据代码库的大小和外部依赖关系,将 Python 2 过渡到 Python 3 可能比你预期的更容易。Python 的官方文档有一些简单的步骤,你可以通过这些步骤来确定你的项目是否“永不过时”。
也就是说,可以在 Python 3 中使用,只需很少的调整或者无需任何调整。你可以采取的最好的第一步就是,使用caniusepython3包来找出那些组件或依赖项(如果有的话)会阻止迁移。
如果你坚持使用 Python 2,是因为某个应用程序的某个特定组件只能在 Python 2 上才能用的话,那么就要从这个组件开始过渡。查看是否存在兼容 Python 3 的替代方案,然后从该点向外重建应用程序。这一想法是找出你对 Python 2 依赖所在的最小位置,并解决它们。
如果你必须以某种形式继续使用 Python 2,那么至少可以做的就是从迁移到最新版本的 Python 2(截止本文成稿时为 Python 2.7.16)开始,并将其作为 Python 3 的出发点。这样,你就可以从 Python 2.7 在其正式生命周期结束之前提供的 Bug 修复获益。
五、使用替代的 Python 2 运行时
如果修改 Python 2 代码库不是一个可行的建议,那么另一种选择是使用由第三方开发的不同的 Python 2 运行时。替代的 Python 2 运行时可能比 Python 2 本身具有更长的支持窗口。
1.Tauthon
据该项目的自述文件称,Tauthon 是 Python 2.7.16 的一个分支,具有从 Python 3.x 派生出来的新语法、内置函数和库。只要维护者能够提供,Tauthon 还包括为该语言提供修复和补丁。
理论上,Tauthon 应该作为 Python 2.7 的替代品。截止本文成稿时的最新版本 Tauthon 2.8 就包括函数注释、强制关键词参数、async/await语法以及以前仅在 Python 3 中可用的其他功能。
2.PyPy
pypy.org/ PyPy 是 Python 的即时加速运行时,它使用 Python 2 作为其内部基础架构的关键部分,并且长期以来一直支持 Python 2 作为其主要版本。
该项目的文档声称“由于 RPython(PyPy 的基础)构建在 Python 2 之上,而这种情况既不可能改变,也就是说,只要 PyPy 本身存在,那么 PyPy 的 Python 版本就会永远存在。”但 PyPy 可能会对一些依赖于 C 扩展的一些 Python 包造成兼容性或性能问题,尽管 PyPy 开发团队一直在努力解决这些问题。
3.IronPython
ironpython.net/ IronPython 是.Net 运行时的 Python 实现,它的 Python 2 版本仍然得到了主动的支持。
它目前的开发人员名单已经宣布,他们为了将精力集中在 IronPython,因此不太可能在 2020 年后继续支持 Python 2。但是,这并不意味着其他人不能继续提供自己的支持。
4.Cython
cython.org/ 另一种可能是 Cython,尽管支持窗口有限。
Cython 将 Python 编译为 C,并提供可选的类型以增强功能。并且,从一开始就支持 Python 2。可以使用 Cython 将 Python 2 代码转换成 C,以继续作为“冻结的”二进制文件来使用。这样做甚至可以提高性能,这要取决于应用程序的性质。(主要是受 I/O 的限制,程序不会有太大的改进。)
不过,Cython 计划在今年年底放弃对 Python 2 的支持。除此之外,你将会陷入使用 Cython 的旧版本继续运行旧版本的 Python 脚本的困境。
六、解决方法:
1.购买扩展的 Python 2 支持
一个长期的解决方案是获得 Python 解决方案供应商的支持。
ActiveState 是 ActivePython 发行版和 Komodo IDE 的创建者,为那些希望继续使用 Python 2 的客户,或者那些希望通过标识 Python 堆栈中必须在 Python 3 重写的部分来迁移到 Python 3 的客户提供支持。
一些供应商为 Python 2 提供支持,作为其在另一个受支持产品中的一部分。
Red Hat 企业版 Linux 6 和 7 包含了 Python 2,因此,从 Red Hat 购买的针对这些版本的操作系统的任何支持合同都将包括在产品的支持生命周期内继续支持 Python 2。
第三种选择是向咨询公司或承包商购买支持。
他们能够提供的支持程度会因你的需求和抱负而有所不同。它可能包括提出一个过渡计划来放弃 Python 2 并重写任何依赖的软件(可能是最好的长期策略),或者手动将 Phthon 2 的补丁合并到运行时的自定义构建中(这做法雄心勃勃,而且还很复杂)。
2.自己维护 Python 2
Python 是一个开源项目。你自己完全可以自由地实现任何需要的修复。
如果修复是对 Python 标准库的修改,这通常不会太难,因为大多数 Python 标准库本身就是用 Python 编写的。但是如果你需要在标准库使用的 C 模块或 CPython 解释器进行更改,那将更具有挑战性。因为你需要了解 C 并熟悉 CPython 的内部结构才能做到这一点。
3.什么都不做
如果它没出故障,请不要试图去修复它。
这是许多企业在 Windows NT 和 Windows 2000 寿命终止时所采用的策略。理论上,仅供内部使用且未公开到公共互联网的 Python 应用程序可以无限期运行。
虚拟机和容器化提供了在受控环境中保持这些类型的应用程序保持正常运行的方法。
你可以将 Python 2 运行时的特定版本“冻结”到容器映像或者虚拟机中,以及它的标准库、应用程序所需的模块和应用程序本身。也就是说,任何遗留的应用程序,即使是没有外部暴露的应用程序,都应该定期重新评估。
七、结语:
不管在什么情况下,对 Python 2 用户来说,最好的长期策略都是迁移到 Python 3。Python 2 尽管非常棒,但它真的已经过时了。
如果你喜欢,请留下你的赞和转发;如果觉得对你有帮助,可以分享给别人
我是一名前端工程师,需要帮助和咨询的小白可以一起来交流学习
企鹅:685+++910+++553