如何将大型Python 2代码库升级到Python 3
Python最初是以Python 2版本开始的,也被称为 遗留版本 。Python2的最后一个版本是Python2.7,在2020年停止服务。Python 3.x作为替代版本推出,相比于Python 2.x版本有许多改进和错误修复。旧版的遗留Python是一个LTS(长期支持)软件,这意味着它有长时间的支持。然而,Python 3.x版本是不向后兼容的发布版本,这使得将Python 2代码库升级到Python 3非常重要,以充分享受Python 3的便捷和支持。开发者进行Python 3升级的最大原因可以归结为:a)开发者的生产力(因为它是动态类型的,非常容易学习和编写代码)和b)性能改进,包括大部分任务的更快性能。
用于升级到Python 3的方法
- 重写代码库为Python 3
-
使用移植过程
方法一:重写整个代码库
只有在软件构建的规模较小时,这种升级代码库的方式才是有帮助的。这是因为任何升级代码库的人都需要对整个代码库的工作原理有一个总体的了解。在Python 3中重写代码可以帮助实现Python 3的特性和易用性,可以缩短代码并提高效率。另外,如果使用其他方法进行代码库的迁移,在整个代码库迁移之前,可能在实现Python 3.x特性时会遇到问题。重写代码库可以解决这个问题,并提供了升级一直想做的任何代码块的机会。
然而,这种方法只适用于代码库规模较小的情况。
方法二:使用移植过程
另一方面,我们可以使用Python移植过程,正如官方文档中所描述的。从高层次上看,此移植过程包括三个步骤:
- 自动转换
-
手动更改
-
运行时验证和修复
然而,所有这些之前的先决条件是要先安装Python 3,以及相关的软件包和库。让我们看一下Windows的进程。
下载和安装 –
https://www.python.org/ftp/python/3.7.4/python-3.7.4.exe
这将安装Python软件。安装完成后,可以使用官方的Python 2到Python 3移植模块或软件(如2to3和其他工具)开始移植过程。这将把代码转换为Python 3,但必须注意以下问题:
更新Setup.py文件以指示Python 3兼容性
设置文件中的分类器必须更新为包含Programming language :: Python :: 3。这将只允许Python 3或某些版本存在于编程环境中(还可以使用特定版本的分类器),从而防止不必要的后退到Python 2代码。这将有助于维护代码的完整性,并允许整个代码库仅存在于Python 3中。
使用Modernize或Futurize脚本
由于Python 3不向后兼容,代码库中的所有脚本必须升级到Python 3标准。在需要升级的每个模块的开头,可以使用Modernize或Futurize等脚本。并不是所有Python功能都会在模块中使用,但是为了确保任何模块的运行顺畅,必须将一些基本函数现代化。因此,官方的Python文档建议添加以下代码,以确保安全性 –
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
这可确保我们目前的代码不会因为一些基本的依赖关系而在Python 3下出现退化和停止工作。然而,更好的方法是使用Pylink项目,其中的 –py3k 标志可以帮助指出我们的代码与Python 3兼容性偏离的情况。这样就可以避免在每个代码块开头分别运行Modernize或Futurize脚本,从而减少代码并减少错误,尽管需要注意的是Pylint只支持Python 3.4或更高版本。
在导入时使用特性检测以确保版本兼容性
在某些情况下,Python 2代码库中的模块可能在Python 3中无法运行。通过使用特性检测,可以了解我们之前的项目是否会支持所有Python 3版本。与版本检测相比,使用特性检测是更安全的方法来检查我们需要使用的正确版本,这将预防未来的问题。
try:
from importlib import abc
except ImportError:
from importlib2 import abc
在比较二进制和文本数据时进行检查
在Python 3中,不能显然混合使用文本和二进制数据类型,否则会导致错误。但是,这个检查不能使用任何其他Python库自动化,因此最好运行自定义代码块来比较基于字符串和二进制的数据。原因是Python 3的 3个字节 与旧的 str 在传统Python中的行为不同。
具有良好的测试覆盖率
拥有良好的测试覆盖率非常重要,可以防止错误,并缩短升级代码所需的时间,只需在需要的地方进行更改。像Coverage.py这样的工具在这种情况下非常有帮助,通过查找执行的内容与错误的差异来确定故障的确切位置。
结论
在本文中,我们讨论了从Python 2迁移到Python 3的一些大型软件代码库的方法,以及我们应该注意的一些约束和一些有用的方法。然而,这个过程在一定程度上可能会因考虑的代码库和项目中使用的库和模块而有所不同。这些通用步骤通常以良好的方式将大多数代码库转换为Python 3并使Python代码现代化。