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