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