如何使用Anaconda來(lái)管理 Python 所用的包和環(huán)境
Anaconda 能讓你輕松安裝在數(shù)據(jù)科學(xué)工作中經(jīng)常使用的包。你還將使用它創(chuàng)建虛擬環(huán)境,以便更輕松地處理多個(gè)項(xiàng)目督惰。Anaconda 簡(jiǎn)化了我的工作流程采呐,并且解決了我在處理包和多個(gè) Python 版本時(shí)遇到的大量問題。
Anaconda 實(shí)際上是一個(gè)軟件發(fā)行版凌净,它附帶了conda悲龟、Python 和 150 多個(gè)科學(xué)包及其依賴項(xiàng)。應(yīng)用程序conda是包和環(huán)境管理器冰寻。
使用conda來(lái)管理包和環(huán)境能減少將來(lái)在處理你要使用的各種庫(kù)時(shí)遇到的問題须教。
管理
包管理器用于在計(jì)算機(jī)上安裝庫(kù)和其他軟件。你可能已經(jīng)熟悉 pip斩芭,它是 Python 庫(kù)的默認(rèn)包管理器轻腺。conda 與 pip 相似,不同之處是可用的包以數(shù)據(jù)科學(xué)包為主划乖,而 pip 適合一般用途贬养。但是,conda并非像 pip 那樣專門適用于 Python琴庵,它也可以安裝非 Python 的包误算。它是適用于任何軟件堆棧的包管理器。也就是說细卧,并非所有的 Python 庫(kù)都能通過 Anaconda 發(fā)行版和 conda 獲得尉桩。在使用 conda 的同時(shí),你仍可以并且仍將使用 pip 來(lái)安裝包贪庙。
Conda 安裝了預(yù)編譯的包蜘犁。例如,Anaconda 發(fā)行版附帶了使用MKL 庫(kù)編譯的 Numpy止邮、Scipy 和 Scikit-learn这橙,從而加快了各種數(shù)學(xué)運(yùn)算的速度。這些包由發(fā)行版的貢獻(xiàn)者維護(hù)导披,這意味著它們通常滯后于新版本屈扎。但是,由于有人需要為許多系統(tǒng)構(gòu)建這些包撩匕,因此鹰晨,它們往往更為穩(wěn)定,而且更便于你使用。
環(huán)境
除了管理包之外模蜡,conda 還是虛擬環(huán)境管理器漠趁。它類似于另外兩個(gè)很流行的環(huán)境管理器,即virtualenv和pyenv忍疾。
環(huán)境能讓你分隔你要用于不同項(xiàng)目的包闯传。你常常要使用依賴于某個(gè)庫(kù)的不同版本的代碼。例如卤妒,你的代碼可能使用了 Numpy 中的新功能甥绿,或者使用了已刪除的舊功能。實(shí)際上则披,不可能同時(shí)安裝兩個(gè) Numpy 版本共缕。你要做的應(yīng)該是,為每個(gè) Numpy 版本創(chuàng)建一個(gè)環(huán)境收叶,然后在適用于項(xiàng)目的環(huán)境中工作骄呼。
在應(yīng)對(duì) Python 2 和 Python 3 時(shí),此問題也會(huì)常常發(fā)生判没。你可能會(huì)使用在 Python 3 中不能運(yùn)行的舊代碼,以及在 Python 2 中不能運(yùn)行的新代碼隅茎。同時(shí)安裝兩個(gè)版本可能會(huì)造成許多混亂和錯(cuò)誤澄峰。而創(chuàng)建獨(dú)立的環(huán)境會(huì)好很多。
也可以將環(huán)境中的包的列表導(dǎo)出為文件辟犀,然后將該文件與代碼包括在一起俏竞。這能讓其他人輕松加載代碼的所有依賴項(xiàng)。pip 提供了類似的功能堂竟,即pip freeze > requirements.txt魂毁。
在 Windows 上,會(huì)隨 Anaconda 一起安裝一批應(yīng)用程序:
Anaconda Navigator出嘹,它是用于管理環(huán)境和包的 GUI
Anaconda Prompt 終端席楚,它可讓你使用命令行界面來(lái)管理環(huán)境和包
Spyder,它是面向科學(xué)開發(fā)的 IDE
管理包
安裝了 Anaconda 之后税稼,管理包是相當(dāng)簡(jiǎn)單的烦秩。要安裝包,請(qǐng)?jiān)诮K端中鍵入conda install package_name郎仆。例如只祠,要安裝 numpy,請(qǐng)鍵入conda install numpy扰肌。
你還可以同時(shí)安裝多個(gè)包抛寝。類似conda install numpy scipy pandas的命令會(huì)同時(shí)安裝所有這些包。還可以通過添加版本號(hào)(例如conda install numpy=1.10)來(lái)指定所需的包版本。
Conda 還會(huì)自動(dòng)為你安裝依賴項(xiàng)盗舰。例如猴凹,scipy依賴于numpy,因?yàn)樗褂貌⑿枰猲umpy岭皂。如果你只安裝scipy(conda install scipy)郊霎,則 conda 還會(huì)安裝numpy(如果尚未安裝的話)。
大多數(shù)命令都是很直觀的爷绘。要卸載包书劝,請(qǐng)使用conda remove package_name。要更新包土至,請(qǐng)使用conda update package_name购对。如果想更新環(huán)境中的所有包(這樣做常常很有用),請(qǐng)使用conda update --all陶因。最后骡苞,要列出已安裝的包,請(qǐng)使用前面提過的conda list楷扬。
如果不知道要找的包的確切名稱解幽,可以嘗試使用conda search search_term進(jìn)行搜索。例如烘苹,我知道我想安裝Beautiful Soup躲株,但我不清楚確切的包名稱。因此镣衡,我嘗試執(zhí)行conda search beautifulsoup霜定。
管理環(huán)境
如前所述,可以使用 conda 創(chuàng)建環(huán)境以隔離項(xiàng)目廊鸥。要?jiǎng)?chuàng)建環(huán)境望浩,請(qǐng)?jiān)诮K端中使用conda create -n env_name list of packages。在這里惰说,-n env_name設(shè)置環(huán)境的名稱(-n是指名稱)磨德,而list of packages是要安裝在環(huán)境中的包的列表。例如助被,要?jiǎng)?chuàng)建名為my_env的環(huán)境并在其中安裝 numpy剖张,請(qǐng)鍵入conda create -n my_env numpy。
創(chuàng)建環(huán)境時(shí)揩环,可以指定要安裝在環(huán)境中的 Python 版本搔弄。這在你同時(shí)使用 Python 2.x 和 Python 3.x 中的代碼時(shí)很有用。要?jiǎng)?chuàng)建具有特定 Python 版本的環(huán)境丰滑,請(qǐng)鍵入類似于conda create -n py3 python=3或conda create -n py2 python=2的命令顾犹。實(shí)際上倒庵,我在我的個(gè)人計(jì)算機(jī)上創(chuàng)建了這兩個(gè)環(huán)境。我將它們用作與任何特定項(xiàng)目均無(wú)關(guān)的通用環(huán)境炫刷,以處理普通的工作(可輕松使用每個(gè) Python 版本)擎宝。這些命令將分別安裝 Python 3 和 2 的最新版本。要安裝特定版本(例如 Python 3.3)浑玛,請(qǐng)使用conda create -n py python=3.3绍申。
進(jìn)入環(huán)境
創(chuàng)建了環(huán)境后,在 OSX/Linux 上使用source activate my_env進(jìn)入環(huán)境顾彰。在 Windows 上极阅,請(qǐng)使用activate my_env。
進(jìn)入環(huán)境后涨享,你會(huì)在終端提示符中看到環(huán)境名稱筋搏,它類似于(my_env) ~ $。環(huán)境中只安裝了幾個(gè)默認(rèn)的包厕隧,以及你在創(chuàng)建它時(shí)安裝的包奔脐。可以使用conda list檢查這一點(diǎn)吁讨。在環(huán)境中安裝包的命令與前面一樣:conda install package_name髓迎。不過,這次你安裝的特定包僅在你進(jìn)入環(huán)境后才可用挡爵。要離開環(huán)境竖般,請(qǐng)鍵入source deactivate(在 OSX/Linux 上)。在 Windows 上茶鹃,請(qǐng)使用deactivate。
保存和加載環(huán)境
共享環(huán)境這項(xiàng)功能確實(shí)很有用艰亮,它能讓其他人安裝你的代碼中使用的所有包闭翩,并確保這些包的版本正確∑#可以使用conda env export > environment.yaml將包保存為YAML疗韵。第一部分conda env export寫出環(huán)境中的所有包(包括 Python 版本)。
上圖可以看到列出了環(huán)境的名稱和所有依賴項(xiàng)及其版本侄非。導(dǎo)出命令的第二部分> environment.yaml將導(dǎo)出的文本寫入到 YAML 文件environment.yaml中〗锻簦現(xiàn)在可以共享此文件,而且其他人能夠創(chuàng)建和你用于項(xiàng)目相同的環(huán)境逞怨。
要通過環(huán)境文件創(chuàng)建環(huán)境者疤,請(qǐng)使用conda env create -f environment.yaml。這會(huì)創(chuàng)建一個(gè)新環(huán)境叠赦,而且它具有在environment.yaml中列出的同一庫(kù)驹马。
列出環(huán)境
如果忘記了環(huán)境的名稱(我有時(shí)會(huì)這樣),可以使用conda env list列出你創(chuàng)建的所有環(huán)境。你會(huì)看到環(huán)境的列表糯累,而且你當(dāng)前所在環(huán)境的旁邊會(huì)有一個(gè)星號(hào)算利。默認(rèn)的環(huán)境(即當(dāng)你不在環(huán)境中時(shí)使用的環(huán)境)名為root。
刪除環(huán)境
如果你不再使用某些環(huán)境泳姐,可以使用conda env remove -n env_name刪除指定的環(huán)境(在這里名為env_name)效拭。
最佳做法
使用環(huán)境
對(duì)我?guī)椭艽蟮囊稽c(diǎn)是,我的 Python 2 和 Python 3 具有獨(dú)立的環(huán)境胖秒。我使用了conda create -n py2 python=2和conda create -n py3 python=3創(chuàng)建兩個(gè)獨(dú)立的環(huán)境缎患,即py2和py3。現(xiàn)在扒怖,我的每個(gè) Python 版本都有一個(gè)通用環(huán)境较锡。在所有這些環(huán)境中,我都安裝了大多數(shù)標(biāo)準(zhǔn)的數(shù)據(jù)科學(xué)包(numpy盗痒、scipy蚂蕴、pandas 等)。
我還發(fā)現(xiàn)俯邓,為我從事的每個(gè)項(xiàng)目創(chuàng)建環(huán)境很有用骡楼。這對(duì)于與數(shù)據(jù)不相關(guān)的項(xiàng)目(例如使用 Flask 開發(fā)的 Web 應(yīng)用)也很有用。例如稽鞭,我為我的個(gè)人博客(使用Pelican)創(chuàng)建了一個(gè)環(huán)境鸟整。
共享環(huán)境
在 GitHub 上共享代碼時(shí),最好同樣創(chuàng)建環(huán)境文件并將其包括在代碼庫(kù)中朦蕴。這能讓其他人更輕松地安裝你的代碼的所有依賴項(xiàng)篮条。對(duì)于不使用 conda 的人,我通常還會(huì)使用pip freeze(在此處了解詳情)將一個(gè) piprequirements.txt文件包括在內(nèi)吩抓。
了解更多信息
要詳細(xì)了解 conda 和它如何融入到 Python 生態(tài)系統(tǒng)中涉茧,請(qǐng)查看這篇由 Jake Vanderplas 撰寫的文章:Conda myths and misconceptions(有關(guān) conda 的迷思和誤解)。此外疹娶,有空也可以參考這篇conda 文檔伴栓。