如何將大型 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://python.club.tw/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

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.