Python 2.x 即將終止支持是時候和它講再見了
Python 2的報廢(EOL)日期遲遲未到,不過現在終於有了眉目。自2020年1月1日起,Python 2將不再得到支持。Python的核心開發人員將不再提供錯誤修復版或安全更新。因此,如果你仍在使用Python 2.x,是時候將代碼移植到Python 3了。如果你繼續使用未得到支持的模塊,可能危及貴企業及數據的安全性,因為無人修復的漏洞遲早會出現。
問題的嚴重性
下面這張表列出了十個流行的Python軟件包及統計數據,來自Python社區開發和共享的軟件的存儲中心Python Package Index。
表中每個軟件包每月下載量達數百萬次。本文中的數據來自2019年6月。
正如你所見,大多數下載的軟件包仍針對Python 2.x版本。在最好的情況下,Web應用程序框架Flask主要是針對3.x而下載的。但即使如此,仍有近三分之一的下載仍針對2.x.
即使這些下載中只有一部分用於實際項目,Python 2報廢仍可能影響數百萬系統的安全性。
Python 2消亡帶來的問題
Python 2報廢帶來了許多問題,這裡是你可能會遇到的幾個問題。
依賴項
NumPy、Requests和TensorFlow等許多大受歡迎的項目承諾到2020年將停止支持2.x,一些項目已經這麼做了。
這意味著如果你想使用青睞的模塊的最新功能,需要使用Python 3。等待更新的時間越長,到時將更改的依賴項的Python 3版本會越多,更新起來會變得越困難。
你可能阻礙其他開發人員
如果你在維護其他開發人員依賴的庫,可能會阻止他們更新到3。如果阻礙其他開發人員,你在間接、可能無意中加大其他項目面臨的安全風險。
你也許不在貴公司外面發布任何代碼,但要考慮可能也在內部使用你代碼的同事。、
你錯失最新功能
Python 3有許多你錯失的新功能,包括如下:
- 來自表達式的好處——允許生成器將其操作的一部分委託給另一個生成器。
- 統一編碼字符串——統一編碼處理起來更容易。
- 打印函數——打印函數有額外的功能,因而使其更靈活。
- 視圖和迭代器取代列表——一些眾所周知的API不再返回列表。比如說,字典返回鍵的視圖、值的視圖或兩者的視圖。
- “multi-with”語句——複雜的with語句更易於閱讀。
- 使用*和**解包——擴大了*可迭代解包運算符和**字典解包運算符的用途。現在可以在函數調用中使用任意數量的解包運算符。
- 純關鍵字實參——允許實參出現在可變長度(varargs)實參的後面。
- F字符串——運行時評估的一種新類型的字符串常量,可能含有任何有效的Python表達式。
- 大量的加速和優化機制。
Python 3.0發佈時,一些新功能向後移植到Python 2.7,可能很熟悉。如果你一直堅持使用2.6或更低版本,這些新功能對你來說可能很陌生。
幫助開發人員
將Python 2.x代碼移植到Python 3可能是很艱鉅的過程。幸好,一些工具和資源可以使這個過程較容易。
Can I Use Python 3 這個程序可檢查你的項目依賴項,看看有沒有依賴項在阻止你使用Python 3。使用該程序來查看你是否需要換掉任何使用Python 2.x的庫。在這種情況下,有必要訪問該庫主頁,看看是否有計劃移植到3。
2to3 這個Python程序試圖將2.x源代碼轉換成3。它通常與Python解釋器一起安裝為腳本。如果你只想看看它對源代碼進行的每次變更有何差異,不用編寫任何更改就可以運行該程序。注意這不完美,你可能仍需要手動修復一些代碼。
《支持Python 3:深入指南》這份免費的開源電子書可指導你逐步完成添加Python 3支持的過程。本電子書解釋了你可能遇到的一些常見遷移問題,並列出了使用Python 3中的新功能改進源代碼的方法。
Six 是一個Python 2和3兼容庫,讓開發人員方便編寫與Python 2和3都兼容的代碼。使用該庫,開發人員可以選擇使用哪個版本的Python解釋器來運行代碼。如果你決定使用該庫,確保代碼表明了這一點:Python版本號可能很快增加到4.0(截至本文發稿時最新版本為3.7.4)。
利用他人的經驗來幫助你——很多人已講述了移植代碼庫方面的經驗。Dropbox在2018年將代碼庫遷移到Python 3,撰寫了一篇博文詳細介紹了經驗。
Python官網還提供了你可能覺得有用的說明文檔。
遷移不是一種選擇
如果無法將代碼庫遷移到Python 3,另一種選擇是出錢請商業公司為你支持Python 2。
至少有一家公司已經宣布推出Python 2支持軟件包和Python 2第三方軟件包。
一些Linux發行版包含Python 2,報廢後仍會得到支持。比如說,CentOS 7和Debian 10都使用Python 2,一直支持到2024年,但不知道到時這種支持是什麼樣的。
改進的機會
維護是任何軟件開發生命週期(SDLC)的重要環節。該環節的一方面是改進軟件性能、增強安全性,這兩者都可以通過升級到Python 3來實現。
換句話說,如果你仍在使用Python 2,這正是改進你如何管理軟件依賴項,並儘量減少安全債務的大好機會。
不要忽視風險
我們NCSC始終強調打補丁的重要性。打補丁並非總是易事,但這是你為了確保技術安全所能做的最基本工作之一。
WannaCry勒索軟件就是一個典例,它表明瞭如果你運行不受支持的軟件會發生什麼。它感染了超過230000台計算機,在全球範圍內重大破壞。最近,Equifax洩密事件導致高達達7億美元的和解。
如果決定報廢後繼續使用Python 2,你就接受了使用不受支持的軟件帶來的種種風險,卻明知道可以使用安全的版本。
但願本文有助於說服你現在是時候開始遷移到Python 3了。
作者:Rich M是英國國家網絡安全中心(NCSC)的平台安全研究員。