13161216443

您所在位置: 首頁> IT培訓> 從 Python 2 到 Python 3,“遷移與否”是個大問題

從 Python 2 到 Python 3,“遷移與否”是個大問題

發布百知教育 來源:IT培訓 2019-11-26

很負責任地告訴你,你可以放棄 Python 2.0 版本了,因為 Python 3 簡直棒極了。當然,如果你能把項目從 Python 2 轉移到 Python 3,那就更好了。盡管 Python 3 大受贊揚,但如何將 Python 2 中大量的應用“遷移到 Python 3 中這個問題一直困擾著技術人員們,這篇文章就為你答疑解惑。

Python 2 即將退出歷史舞臺

Python 3 已經發布十年了。Python 2 的產品壽命結束時間最初被設定為 2015 年,但是它被延長到了 2020 年 1 月 1 日——原因是 2013 和 2014 這兩年間,人們還沒做好準備將項目“遷移”到 Python 3 上。Python 3.0 幾乎無法使用,Python 3.1 和 3.2 比 Python 2 運行慢。造成這種問題的根源在于許多第三方庫仍然使用 Python 2。直到 2012 年,200 個最常用的 Python 包中僅有一半遷移到了 Python 3 上,而到了 2018 年,仍然只有 95% 左右的 Python 包被遷移過來,這還都是些人們最常用的 Python 包,至于那些不太常用或不流行的,就更無人問津了,所以最后壽命結束期限又延長了 5 年。這 5 年中,Python 3 的變化不可同日而語。Python 3(3.6 及以上版本)的最新版本不僅運行速度快而且功能豐富。

為什么仍然有一些 Python 2 項目?

從業務的角度來看,遷移的成本太高了。作為開發人員,在過去的幾年里,我們編寫的每一行 Python 2 代碼都是一筆技術債。但大多數公司不是由開發者運營的。所有的商業決策都是經理制定的,而他們的關注點是那些能為公司帶來業務價值的項目。事實上,一種在幾個月內就會被淘汰的編程語言,不足以讓人為它花費時間重寫所有項目。將項目從 python2 遷移到 python3 是很昂貴的,而且這么做也不會給公司帶來更多價值。雖然它會為項目做些改進,但卻不會為產品添加任何新特性。

就像女人的衣柜永遠都少了一件晚禮服一樣,總是有一些新特性在等待著技術人員去開發,總有一個緊急的漏洞需要修復。如果你是“敏捷開發”(因為現在人人都是敏捷開發),并且有一堆待辦事項,如果遷移到 Python 3 能排到待辦事項列表中,那也只能是最后一項。如果你是一家小型初創企業,那么你需要的不是完美的、最新的代碼,而是要添加新功能并改善用戶體驗。

如果你是一家大公司,那么情況就不同了。如果遷移大量遺留下來的 Python 代碼(甚至有 3500 萬行 Python 2 代碼)那絕對是一件讓人崩潰的事。更糟糕的是,如果這些代碼中有一些是已經離職的前員工編寫的,幾乎沒有經過測試,文檔也很差,老舊過時。但是這些代碼仍然能正常工作,只是沒有人知道它是如何工作的,多年來都沒人用過它們。在某種程度上,你將不得不重寫它,因此這些代碼一直“半死不活”地留在 Python2 中。

繼續使用 Python 2 的風險

我們來做個假設——時間快進兩個月,Python 2 徹底“退休”,所有人都在準備迎接 Python 3,而你只能面對著仍在 Python 2 上運行的生產代碼望洋興嘆。并開始思考:“最壞的結果是什么?”

結果就是——你可能被黑。當然了,在 Python 3 或其他任何編程語言上也可能被黑,但在 Python 2 上被黑的風險更大。沒有人會再更新 Python 2,更不會有人去修復里面的 bug。這還不是最糟糕的,更糟糕的是用戶要考慮正在使用的 Package,因為大多數 Package 已經放棄了其 Python 2 版本,明年一月將會有更多 Package 放棄 Python 2。那么,對 Python 2 的依賴越大,出現安全問題的可能性就越大。

即使軟件沒有任何安全問題,隨著時間的推移,它也會慢慢地開始崩潰。如果每次更新部分系統(更新系統保持安全),就會出現系統與新軟件不兼容的問題。也許一些開發人員會從 PyPI 中刪除他們的 Packages,那么最終的結果就是花越來越多的時間去填坑以使項目繼續運行。

Python 2 還有救嗎?

是不是只能眼睜睜看著 Python 2“壽終正寢”無計可施?我只能說,如果可以將項目遷移到 Python 3,那就這么做吧。因為遷移后得到的長期收益將遠遠超過遷移的成本。但是如果可以遷移,相信很多人早已那么做了,就不會閱讀本文了。所以我假設你不想遷移項目而是在尋找其他的解決方案,下面是我列出的 Python 2 項目其他解決方案,從我主觀出發,按照解決方案難度排序:

 什么都不做

你可以掩耳盜鈴,假裝 Python 3 不存在,忽略 Python 2 即將“壽終正寢”的事實。正如我之前提過的,不更新軟件,“執著”地冒著數據泄露的風險繼續使用 Python 2,即使一些依賴項可能在某個時間停止工作也無所謂。但是,如果僅在計算機上運行的某種內部腳本上使用 Python 2,而且它沒有依賴項,那么,什么都不做就是最好的解決方案。如果你的軟件可能明年就會過時,這時就要衡量下利弊再慎重決定到底要不要遷移。

 凍結應用狀態

對于那些你不用擔心安全問題的內部工具,凍結應用狀態是個不錯的解決方案(這里所說的“內部”是指斷網狀態)。但如果一些依賴項出現漏洞,那就麻煩了。明年依賴 Python 2 的項目就會開始出現問題,就像我上文提到的,人們會從 GitHub 甚至 PyPI 上刪除舊項目,你還記得刪除一個填充文本的庫結果所有構建的代碼開始崩潰的烏龍事件嗎?那時候所有人都嘲笑了 JavaScript,那就做好準備迎接同樣的嘲笑吧,只是,可能都不會有人嘲笑你了,因為你所使用的是 Python 的棄用版本。

幸運的是,我們還有 docker 和其他允許你創建 immutable containers 的工具。編寫一個使用 Python 2 作為基本映像的 Dockerfile。添加依賴項并將應用設置成一個 docker 鏡像。將設置好的 image 推入公共或私人存儲庫。于是,你就擁有了一個帶有辦公應用的 immutable container,你可以共享它并按照自己的用途使用它,而不必擔心某些依賴項不可用。它解決了內部工具的大多數問題?,F在能用就快使用吧,別等到 2020 年應用開始出現各種問題時再使用就為時已晚了。

 改變 Python 翻譯器

當我提及“Python 2 不再使用”時,我的意思是“CPython 2 不再使用”。CPython 是最流行的 Python 翻譯器,所以對于很多人來說,Python == CPython。但它不是唯一的翻譯器。例如,還有可以替代 CPython 的 PyPy。

那么,為什么不是所有人都使用 PyPy 呢?因為 PyPy 有一些限制。如果你的項目非常依賴 C 擴展,那么 PyPy 可能不適合你。但如果你切換到 PyPy,需要用測試來驗證是否所有程序正常運行,如果能夠運行,你的應用程序甚至可能比以前運行得更快。不得不說,這是一個很好的“副作用”。

PyPy 不是唯一的選擇。Intel 保留了自己的 Python 發行版,稱為“Intel?Python 發行版”。這是一個支持 Python 的 2.7 和 3.6 的免費發行版。當我與一位該項目參與者交談時,他們表示不打算在近期內棄用 2.7 版本。

 商業 Python 發行版

除上述方案外,還有商業解決方案。其中之一是 Red Hat Enterprise Linux (RHEL)。如果你購買了版本 8,直到 2024 年 6 月 Red Hat 將一直為你提供 Python 2 的支持服務。這就相當于為你在 Python 2 上多買了 4 年的 bug 修復和更新,代價就是從免費和開源的編程語言轉換到讓人付費使用他們發布的 Python。你也可以在網上找到其他 Python 2 付費版本供應商。

 構建自己的 CPython 2

如果你不想花錢請任何人來修復 Python 2,你可以自己做。你需要做的是:衍生 CPython 存儲庫,等待漏洞出現,對它們進行修補,編譯自己的 CPython 版本,并在生產服務器上使用它。除非你清楚自己在做什么,否則這真的不是個好主意,因為誰都不希望在自己的服務器上引入漏洞。

項目遷移至 Python 3

如果以上選項都不適合你,那么你可能最終會還是會把項目遷移到 Python3。有兩種常見的方法可以做到這一點:跨代碼將 Python 2 代碼重寫為 Python 3。

 跨代碼

跨行代碼的意思是同時使用 Python 2 和 Python 3 的代碼。這聽起來像是要做更多的工作,因為你需要同時支持兩個主要的 Python 版本,但是這樣會使轉換更容易—不會出現 Python2 轉換到 Python3 過于突然的問題。首先在 Python 3 下運行測試(當然,大多數測試都會失?。?,然后不斷重寫應用程序的各個部分,直到它能夠在 Python 2 和 Python 3 上工作為止。接下來要在生產環境中更改 Python 版本,最后刪除 Python 2 代碼。此方法最大的好處是你可以在迭代中完成此工作。您可以在遷移系統各個部分的同時不斷為代碼添加新特性,這種方法也是客戶喜聞樂見的。

 將 Python 2 重寫為 Python 3

另一種選擇是用 Python3 重寫 Python2 的部分代碼。這個辦法輕松些,因為你不用再考慮 Python 2。典型的辦法是將應用程序的 Python2 版本保持在生產環境中,在一個單獨的 git 中使用 Python3 版本。然后你要不斷地測試新版本,當它準備好時,你就可以放棄 Python 2,使用 Python 3 版本。如果有些程序還沒有測試就“滾”回到了 Python 2,那就太讓人崩潰了。需特別注意的是,這種方法意味著你需要暫停向應用中添加新特性。

 重新編寫應用

最后也是最困難的解決方案,用 Python 3 或你認為最有效的任何其他編程語言從頭重寫應用程序。這種解決方案可謂“勞民傷財”,而且只有當 Python 2 版本只是一個 prototype 時才有效。但它可以讓你完全重新設計你的項目,或許真的對你有用。

到底要不要遷移到 Python 3?

正如我一開始說的那樣,如果可以將項目遷移到 python3,那么趕緊做吧。Python3 不僅比 Python 2 快很多,而且它有更多優秀的新特性,例如 asyncio、type hints、ordered dictionaries、f-strings 和更好的 Unicode 支持。風云已起,開發者還應早作打算。


注釋:本文內容來自公眾號 InfoQ


pythn培訓班:http://www.akpsimsu.com/python2019


上一篇:大數據培訓 | 與行業的對接,顯示大數據未來的巨大前景

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.akpsimsu.com

有位老師想和您聊一聊

關閉

立即申請