如何将大型 Python 2 代码库更新到 Python 3?


介绍

Python 最初以 Python 2 版本开始,也称为旧版本。Python 2 的最后一个版本是 Python 2.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 重写代码库

  • 使用移植过程

方法 1:重写整个代码库

这种升级代码库的方法仅适用于小规模软件。这是因为任何升级代码库的人都需要对整个代码库的工作原理有一个整体的了解。用 Python 3 重写代码可以帮助实现 Python 3 的特性和易用性,从而缩短代码并使其更高效。此外,如果使用其他方法迁移代码库,则可能无法实现 Python 3.x 特性,除非整个代码库都已迁移。重写代码库解决了这个问题,也为我们提供了升级长期以来一直想要升级的任何代码块的机会。

但是,此方法仅在代码库规模较小的情况下有效。

方法 2:使用移植过程

另一方面,我们可以使用官方文档中描述的 Python 移植过程。高级别上,此移植过程是一个三步过程:

  • 自动转换

  • 手动更改

  • 运行时验证和修复

但是,所有这些的前提是首先安装 Python 3 及其相关的包和库。让我们看看 Windows 的过程。

下载并安装:

https://www.pythonlang.cn/ftp/python/3.7.4/python-3.7.4.exe

这将安装 Python 软件。安装完成后,可以使用官方的 Python 2 到 Python 3 移植模块或软件(例如 2to3 等)启动移植过程。这将使用 Python 3 移植代码,但必须注意以下问题:

更新 Setup.py 文件以表示 Python 3 兼容性

必须更新 setup 文件中的分类器,使其包含 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 下停止工作,这是由于一些基本依赖关系造成的。但是,更好的方法是使用 Pylint 项目,其 --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 字节与旧版 Python 中的str的行为方式不同。

拥有良好的测试覆盖率

拥有良好的测试覆盖率对于防止错误非常重要,并且可以通过仅更改需要更改的地方来缩短升级代码所需的时间。Coverage.py 等工具在这种情况下非常有帮助,它可以找出已执行内容和错误之间的区别,从而找出确切位置的错误。

结论

在这里,我们介绍了一些将大型软件代码库从 Python 2 迁移到 Python 3 的方法,以及我们应该注意的一些约束以及可以使用的一些有用方法。但是,具体过程可能因所考虑的代码库以及项目中使用的库和模块而异。这些通用步骤通常可以很好地将大多数代码库转换为 Python 3 并使 Python 代码现代化。

更新于:2023年5月2日

浏览量:146

开启你的职业生涯

完成课程获得认证

开始学习
广告