10年前,Python開(kāi)發(fā)者社區(qū)決定對(duì)Python語(yǔ)言做一個(gè)系統(tǒng)性的清理,于是他們發(fā)行了一個(gè)向后不兼容的Python新版本——Python 3。顯然,初期的社區(qū)開(kāi)發(fā)者低估了他們這次改動(dòng)的影響,也低估了Python語(yǔ)言的流行度。不過(guò),在過(guò)去的10年當(dāng)中,絕大部分的社區(qū)項(xiàng)目還是遷移到了新的Python版本,并且他們當(dāng)中大多數(shù)已經(jīng)放棄了對(duì)Python 2的支持。
在紅帽Linux 8企業(yè)版(以下簡(jiǎn)寫為RHEL 8)中,Python 3.6已經(jīng)是默認(rèn)的設(shè)置了,但是RHEL 8中仍然支持Python 2。
在RHEL 8中使用Python
安裝Python,你可以輸入命令 yum install python3。
運(yùn)行Python,你可以輸入命令 python3。
如果這樣不成功,或者你需要更多詳細(xì)信息,那么請(qǐng)接著往下看!
Python 3
在RHEL 8中,Python 3.6是默認(rèn)的、完全支持的Python版本,但跟系統(tǒng)中的其它工具一樣,它并非總是默認(rèn)安裝的。你可以使用命令 yum install python3 來(lái)安裝它。
通常情況下,附帶的安裝包名字是有"python3"前綴的。你可以使用命令 yum install python3-requests 來(lái)安裝流行而出名的HTTP請(qǐng)求處理的工具包requests。
Python 2
并非所有的軟件/程序都做好了能在Python 3下運(yùn)行的準(zhǔn)備。不過(guò)關(guān)系不大, RHEL 8仍然自帶Python 2 棧,并且它可以跟Python3一起同時(shí)被安裝在系統(tǒng)中。你可以使用命令 yum install python2 來(lái)安裝Python 2, 然后使用命令 python2 來(lái)運(yùn)行Python 2
為啥不干脆統(tǒng)一成 "Python" ?
好的,好的,現(xiàn)在我們已經(jīng)同時(shí)有了 python3 和 python2 這2個(gè)命令了,但是如果我就是想用 python 呢? 呃,試一下...
然鵝,系統(tǒng)默認(rèn)下,并沒(méi)有一個(gè)叫做 python 的命令啊。
這是為啥呢?坦率地說(shuō),是因?yàn)槲覀儧](méi)法就 python 這個(gè)命令具體表示什么達(dá)成一致意見(jiàn)。開(kāi)發(fā)者社區(qū)有2大陣營(yíng)。其中一派期望python 命令表示Python 2,而另一派卻希望表示Python 3。兩大陣營(yíng)的人不是很經(jīng)常跟對(duì)方溝通,所以你可能會(huì)成為其中一個(gè)陣營(yíng)的成員而對(duì)另外一個(gè)陣營(yíng)的人一無(wú)所知——但實(shí)際上他們的確存在。
現(xiàn)在,已經(jīng)是2018年了,認(rèn)同 python == python2 的人越來(lái)越多,即使是在那些更喜歡使用Python 3的人中也是如此(這類人會(huì)清晰地用python3來(lái)指代Python 3)。認(rèn)同 python == python2 也已經(jīng)得到了Python官方上游建議的支持——PEP 394。然而,我們期望這個(gè)觀點(diǎn)在RHEL 8的流行期內(nèi)變得越來(lái)越不流行,因?yàn)樽?python 一直指代Python 2,Red Hat將會(huì)使自己陷入困境。
無(wú)版本的Python命令
就是說(shuō),有一些應(yīng)用程序期望存在這么一個(gè)python命令,并且這種設(shè)想很難去改變它,即確實(shí)存在這種場(chǎng)景。這就是為啥你可以使用alternatives機(jī)制在系統(tǒng)層面激活這個(gè)無(wú)版本的 python 命令并將它設(shè)置成一個(gè)指定的Python版本:
同理,如果是Python 2,上述命令可以相應(yīng)改成 /usr/bin/python2。如果你想知道如何撤銷這種修改或者想知道如何交互式地進(jìn)行設(shè)置,請(qǐng)使用 man unversioned-python 命令了解詳情。
需要注意的是,我們不推薦使用這種方式。我們還是推薦你顯式地指定 python3 或者 python2 命令。因?yàn)橹挥羞@樣,你的Python腳本才可以在任何一臺(tái)正確安裝了Python的機(jī)器上運(yùn)行而不報(bào)錯(cuò)。
需要注意的是,這種方式,只對(duì) python 這個(gè)命令本身有效。安裝包或者其他的命令并沒(méi)有相應(yīng)地配置過(guò)無(wú)版本。所以即使你配置好了 python 命令,yum install python-requests 命令或者 pip 命令也還是不能工作,已Python 3為例,你需要相應(yīng)的使用 yum install python3-requests 或者 pip3。
請(qǐng)記住在這些情況下,盡量使用顯示的版本。最好也不要依賴pip,venv這類命令和其他你可以從命令行調(diào)用的Python命令的包裝腳本。相應(yīng)地,請(qǐng)使用 python3 -m pip, python3 -m venv, python2 -m virtualenv 這種顯式指定Python版本的命令。
第三方的包
并非所有Python相關(guān)的包都默認(rèn)安裝在RHEL 8——只有那些能被Red Hat驗(yàn)證,打包以及支持的才會(huì)被默認(rèn)安裝在系統(tǒng)中。
網(wǎng)上很多建議你使用sudo pip install命令來(lái)安裝一個(gè)Python的第三方包。千萬(wàn)不要這么做!這個(gè)命令真正的意思是"從網(wǎng)上下載一個(gè)安裝包,并在我的機(jī)器上使用root身份去安裝它"。
即使這個(gè)第三方的安裝包是值得信賴的,這么做也是一個(gè)壞主意。RHEL 8很大一部分功能依賴Python 3.6。如果貿(mào)然給系統(tǒng)安裝了一個(gè)第三方包,你沒(méi)辦法保證它可以跟系統(tǒng)中其他的軟件包工作地很好。雖然操作系統(tǒng)在某些層面會(huì)自帶一些防護(hù)措施,不過(guò)你最好還是要有sudo pip會(huì)破壞你的系統(tǒng)這樣的意識(shí)。(更別提實(shí)際上sudo pip根本不會(huì)按照你預(yù)想的那樣工作,正確的命令的是pip3或者pip2。 )
如果你希望使用第三方的安裝包,你可以使用python3 -m venv --system-site-packages myenv命令創(chuàng)建一個(gè)虛擬環(huán)境(或者Python 2的話,相應(yīng)地需要安裝python2-virtualenv,并且命令為python2 -m virtualenv --system-site-packages myenv),然后,使用source myenv/bin/activate命令激活這個(gè)虛擬環(huán)境,最后可以使用pip install命令往虛擬環(huán)境中安裝需要的包。做完這些操作之后,安裝包應(yīng)該就已經(jīng)被安裝在了虛擬環(huán)境中了,前提是虛擬環(huán)境已經(jīng)被激活了。雖然這種方式無(wú)法保護(hù)你不受可疑安裝包的侵害,但它卻可以保護(hù)操作系統(tǒng)免受意外的破壞。
一個(gè)虛擬環(huán)境被激活后,諸如python和pip這類無(wú)版本的命令將會(huì)指代創(chuàng)建虛擬環(huán)境的Python版本。所以,要安裝第三方包Requests,可以直接使用命令pip install requests來(lái)安裝。(如果你比較喜歡顯式指定的話,可以使用python -m pip install requests)。
命令中的--system-site-packages開(kāi)關(guān)選項(xiàng)允許你的多個(gè)虛擬環(huán)境在系統(tǒng)層面可以重用安裝包,假如你希望的是一個(gè)完全隔離的環(huán)境,那么請(qǐng)去掉這個(gè)選項(xiàng)開(kāi)關(guān),不過(guò)那樣的話,所有Python標(biāo)準(zhǔn)庫(kù)之外的第三方庫(kù)你都需要顯式地安裝它們。
還有另外一種情況,就是可以使用--user開(kāi)關(guān)選項(xiàng),安裝用戶相關(guān)的包。比如python3 -m pip install --user flake8這個(gè)命令將會(huì)讓Python的代碼校驗(yàn)工具flake8只為你這個(gè)用戶安裝,從而不會(huì)影響系統(tǒng)中的其他工具,比如yum。
萬(wàn)一你真的需要在整個(gè)系統(tǒng)層面安裝一些包或者軟件,建議你可以構(gòu)建一個(gè)RPM的包,然后使用命令yum install來(lái)安裝到系統(tǒng)層面。
須知:使用pip安裝的第三方安裝包沒(méi)有經(jīng)過(guò)Red Hat的審核和支持。
Platform-Python:隱藏的Python
細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn)了其中有個(gè)"問(wèn)題":既然Python并非系統(tǒng)默認(rèn)安裝,yum是系統(tǒng)默認(rèn)安裝,而yum是由Python編寫的,這到底是怎么回事呢?
事實(shí)上,操作系統(tǒng)中存在一個(gè)隱藏的內(nèi)部Python解釋器叫做"Platform-Python"。這也是很多系統(tǒng)工具所使用的python。與正常的Python不同的是,它只包含了一些運(yùn)行系統(tǒng)所必須的最小Python功能,所以無(wú)法保證其中哪些特性會(huì)在將來(lái)被移除。
然而,Platform-Python的庫(kù)是與對(duì)用戶可見(jiàn)的Python 3.6共享的。這樣可以節(jié)省磁盤空間,并且這也意味著使用Python 3.6編譯的yum擴(kuò)展也可以在其他系統(tǒng)工具中正常工作。
如果你不是重新構(gòu)建發(fā)行版,請(qǐng)務(wù)必不要直接使用Platform-Python,建議你去安裝一個(gè)python3然后用phthon3吧。
遷移至Python 3
雖然并不會(huì)是在RHEL 8中,但是終會(huì)有一天Python 2將不再得到社區(qū)和官方的支持。如果你還有Python 2的代碼在維護(hù),你最好考慮一下將它遷移至Python 3。
Python 3在2008年第一次發(fā)行。在超過(guò)10年的發(fā)展中,Python 3不論是在自身特性上,還是在性能——甚至有點(diǎn)諷刺地說(shuō)即使是在對(duì)Python 2的兼容性方面均有很大的改進(jìn)和提升。你或許之前有聽(tīng)說(shuō)過(guò)將遺留代碼遷移至Python 3.0或者 3.2是多么恐怖的一件事情,不過(guò)現(xiàn)在這件事已經(jīng)變得沒(méi)那么嚇人了。
當(dāng)然,我并不是說(shuō)遷移至Python 3不重要,但是它顯然已經(jīng)變得比之前容易太多了。就像其他對(duì)系統(tǒng)的修改一樣,遷移至Python 3需要的僅僅是你的代碼庫(kù),充足的測(cè)試,以及——一些時(shí)間而已。
那么,遷移到Python3有什么好處? Python 3是一個(gè)相對(duì)更好的語(yǔ)言——畢竟,它是連 Python 2的開(kāi)發(fā)人員都在用的編程語(yǔ)言!對(duì)于企業(yè)級(jí)的應(yīng)用,Python 3 最主要的特性就是可以降低難調(diào)試的風(fēng)險(xiǎn),以及在處理非ASCII字符型文本時(shí)的輸入Bug,比如人名(或者表情)。
社區(qū)有很多資源和文檔可以幫助你遷移到Python 3。
如果你正在閱讀這篇博文,那很可能你正在使用一個(gè)大型、保守陳舊的代碼庫(kù)。針對(duì)這種情況,我們總結(jié)了一些自己的精華經(jīng)驗(yàn)在這里:《The Conservative Python 3 Porting Guide》(https://portingguide.readthedocs.io/en/latest/),它是一篇手把手教你關(guān)注兼容性并且在整個(gè)的遷移過(guò)程中保持代碼始終是工作的。建議你不妨試一試,如果你發(fā)現(xiàn)哪些文章中沒(méi)有覆蓋到,歡迎聯(lián)系我們——你甚至可以直接在GitHub上提merge request。
如果你在維護(hù)Python C的擴(kuò)展,推薦你看一下這個(gè)精華的手冊(cè),它來(lái)自py3c項(xiàng)目(https://py3c.readthedocs.io/en/latest/)的一部分.
知識(shí)點(diǎn)總結(jié)
在RHEL 8中安裝或使用Python,請(qǐng)使用python3—— 除非你腦子里想的是其他版本。
- 千萬(wàn)不要使用sudo pip。
- 千萬(wàn)不要在你的應(yīng)用中使用系統(tǒng)自帶的platform-python。如果你是在為RHEL 8編寫系統(tǒng)/管理層面的代碼,那另當(dāng)別論。
- 當(dāng)然,如果你仍然還有一些Python 2的遺留代碼,那么現(xiàn)在將是為它們開(kāi)始“現(xiàn)代化”的最好時(shí)機(jī)啦。
最后,祝你們?cè)赗HEL 8中愉快地使用Python!
英文原文:https://developers.redhat.com/blog/2018/11/14/python-in-rhel-8/
譯者:Zoe
注:我這有個(gè)學(xué)習(xí)Python基地,里面有很多學(xué)習(xí)資料,感興趣的+Q群:895817687