和眾多 Linux 分發(fā)版本一樣姆吭,macOS 中也自帶了一份 Python 運(yùn)行環(huán)境已艰。打開(kāi)命令行痊末,直接鍵入 python 即可,觸手可及哩掺。
但是凿叠,系統(tǒng)中自帶的 Python 版本一般是 Python 2.7。如果希望嘗試其他版本嚼吞,這份系統(tǒng)自帶的 Python 就無(wú)法滿(mǎn)足需求了盒件。很多人下意識(shí)的做法是去官方網(wǎng)站,尋求一份需要的版本進(jìn)行安裝舱禽,這種方式雖然正統(tǒng)炒刁,但也存在一定的弊端:不夠靈活、會(huì)在系統(tǒng)中安裝額外的軟件和工具誊稚、切換不同 Python 版本時(shí)相對(duì)比較麻煩翔始。
今天要介紹的 pyenv 正是為了解決這些問(wèn)題而出現(xiàn)一款工具。pyenv 是一款 Python 版本管理器片吊,可以讓用戶(hù)輕松的在多個(gè) Python 版本之間進(jìn)行切換绽昏,此外,pyenv 還可以集成 virtualenv 以項(xiàng)目為單位進(jìn)行環(huán)境隔離俏脊。經(jīng)由 pyenv 管理的 Python 環(huán)境(或者是項(xiàng)目)還可以繼承給 Atom 或者 PyCharm全谤,這樣一來(lái),開(kāi)發(fā)人員只要打開(kāi)了某個(gè)項(xiàng)目爷贫,也就打開(kāi)了專(zhuān)門(mén)為這個(gè)項(xiàng)目創(chuàng)建的獨(dú)立環(huán)境认然。
接下來(lái)我們將演示如何在 macOS 下配置 pyenv 環(huán)境。由于下面的步驟嚴(yán)重依賴(lài)國(guó)外網(wǎng)站漫萄,所以請(qǐng)確保命令行下配置了使用 http_proxy 和 https_proxy 環(huán)境變量的科學(xué)上網(wǎng)卷员,否則可能導(dǎo)致安裝失敗。
安裝
pyenv-installer 是 pyenv 附帶的一份安裝腳本腾务。用戶(hù)僅需一條命令毕骡,即可調(diào)用 pyenv-installer 腳本完成安裝。
$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
這個(gè)腳本不僅會(huì)幫我們安裝 pyenv岩瘦,還會(huì)附帶安裝一些 pyenv 的插件未巫,其中就包括 virtualenv。因此启昧,在跑完這個(gè)腳本之后叙凡,virtualenv 也已經(jīng)可以使用了。
我們還需要在 .bash_profile 中添加以下兩行密末,使得每次打開(kāi)命令行之后握爷,pyenv 都可以自動(dòng)配置在環(huán)境變量中跛璧。
# Enable pyenv
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
添加之后,保存 .bash_profile新啼,再執(zhí)行 source追城,即可生效。
$ source ~/.bash_profile
卸載
pyenv 會(huì)安裝在用戶(hù)家目錄下的 .pyenv 文件夾中师抄,不會(huì)安裝在家目錄外的系統(tǒng)文件夾中漓柑。因此教硫,只要?jiǎng)h除該文件夾叨吮,即是刪除了 pyenv。
$ rm -rf ~/.pyenv
Python 版本管理
在 pyenv 生效后(source或新開(kāi)終端)瞬矩,便可以使用 pyenv 命令行工具進(jìn)行 Python 版本管理茶鉴。
查看所有可下載的 Python 版本
$ pyenv install --list
Available versions:
2.1.3
2.2.3
2.3.7
2.4
...
stackless-3.3-dev
stackless-3.3.5
stackless-3.4.1
stackless-3.4.2
安裝某個(gè) Python 版本
$ pyenv install 3.5.1
Downloading Python-3.5.1.tar.xz...-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz
Installing Python-3.5.1...
Installed Python-3.5.1 to /Users/colinleefish/.pyenv/versions/3.5.1
這里的操作實(shí)際是從官方下載源碼,然后現(xiàn)場(chǎng)編譯出 Python 環(huán)境并放在 ~/.pyenv 中景用。注意:如果是首次嘗試安裝涵叮,多數(shù)都會(huì)因?yàn)楦鞣N原因失敗。我故意沒(méi)寫(xiě)解決辦法伞插,請(qǐng)自行上網(wǎng)尋求方法割粮。[滑稽]
另外,經(jīng)測(cè)試媚污,在網(wǎng)絡(luò)狀況較好的環(huán)境中舀瓢,下載該源碼包的速度很理想。如果使用 http_proxy 等科學(xué)上網(wǎng)耗美,反而會(huì)出現(xiàn)驗(yàn)證 HTTPS 超時(shí)的可能京髓。因此,如果在網(wǎng)速快的情況下進(jìn)行下載商架,建議暫時(shí)取消科學(xué)上網(wǎng)堰怨。
查看已安裝的 Python 版本和已創(chuàng)建的環(huán)境
$ pyenv versions
system
2.7.13
2.7.13/envs/mkdocs
* 2.7.13/envs/tango_with_django
...
tango_with_django
theotherbarn
system 為系統(tǒng)自帶的 Python 環(huán)境;標(biāo)星號(hào)的為當(dāng)前激活的全局 Python 環(huán)境蛇摸。
基于某個(gè) Python 版本創(chuàng)建環(huán)境隔離的項(xiàng)目
$ pyenv virtualenv 3.4.6 my-awesome-project
Using base prefix '/Users/colinleefish/.pyenv/versions/3.4.6'
New python executable in /Users/colinleefish/.pyenv/versions/3.4.6/envs/my-awesome-project/bin/python3.4
Also creating executable in /Users/colinleefish/.pyenv/versions/3.4.6/envs/my-awesome-project/bin/python
Installing setuptools, pip, wheel...done.
在創(chuàng)建該環(huán)境的過(guò)程中备图,virtualenv 會(huì)很貼心地幫我們安裝好 setuptools, pip 和 wheel,這樣一來(lái)赶袄,我們馬上就可以使用 pip 了揽涮。
激活某個(gè)項(xiàng)目
$ pyenv activate my-awesome-project
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(my-awesome-project)$
激活時(shí),在上面實(shí)例第二行會(huì)有一個(gè)提醒弃鸦,可以放心忽略绞吁。激活后,在命令行的開(kāi)頭部分會(huì)有括號(hào)標(biāo)注的項(xiàng)目名稱(chēng)唬格。
使用該項(xiàng)目
(my-awesome-project)$ python --version
Python 3.4.6
(my-awesome-project)$ pip install requests
Collecting requests
Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
Using cached idna-2.6-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
Using cached urllib3-1.22-py2.py3-none-any.whl
Installing collected packages: chardet, idna, certifi, urllib3, requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
(my-awesome-project)$
我們?cè)谶@個(gè)隔離的環(huán)境中安裝了 requests家破,這個(gè)過(guò)程中還安裝了一些 requests 的依賴(lài)包颜说。那它們都被安裝在了哪里呢?
(my-awesome-project)$ cd ~/.pyenv/versions/my-awesome-project/lib/python3.4/site-packages
(my-awesome-project)$ ls
__pycache__ easy_install.py pkg_resources urllib3
certifi idna requests urllib3-1.22.dist-info
certifi-2017.7.27.1.dist-info idna-2.6.dist-info requests-2.18.4.dist-info wheel
chardet pip setuptools wheel-0.30.0.dist-info
chardet-3.0.4.dist-info pip-9.0.1.dist-info setuptools-36.6.0.dist-info
這些依賴(lài)包汰聋,都被安裝在了 ~/.pyenv 下一個(gè)獨(dú)立的文件夾中门粪,而且和系統(tǒng)的 Python 環(huán)境、其他 Python 環(huán)境做到了隔離烹困。日后如果不再需要該項(xiàng)目玄妈,只需使用 pyenv 自帶的命令刪除,或刪除這個(gè)項(xiàng)目文件夾即可髓梅。
如果您使用 Atom 等編輯器拟蜻,并可以從命令行啟動(dòng),這類(lèi)編輯器會(huì)自動(dòng)繼承當(dāng)前的項(xiàng)目環(huán)境枯饿,這樣就可以在編輯器中運(yùn)行該項(xiàng)目的代碼了酝锅。
(my-awesome-project)$ atom
取消激活某個(gè)項(xiàng)目
(my-awesome-project)$ pyenv deactivate
$
使用 pyenv deactivate 即可取消激活當(dāng)前的環(huán)境。在此之后奢方,命令行提示符前面的括號(hào)內(nèi)容就消失了搔扁,Python 環(huán)境回歸了正常的全局環(huán)境。
設(shè)置全局 Python 環(huán)境
$ pyenv global my-awesome-project
(my-awesome-project)$ python --version
Python 3.4.6
使用 pyenv global 命令蟋字,可以為命令行設(shè)置全局生效的環(huán)境或項(xiàng)目稿蹲。在關(guān)掉當(dāng)前 Shell,再新開(kāi)其他 Shell 時(shí)鹊奖,一直都會(huì)使用當(dāng)前環(huán)境苛聘。
如果希望恢復(fù)該設(shè)置,使用 pyenv global system嫉入。
(my-awesome-project)$ pyenv global system
$
此時(shí)焰盗,全局環(huán)境便又恢復(fù)為系統(tǒng)默認(rèn)的環(huán)境了。
查看當(dāng)前 Python 項(xiàng)目或環(huán)境
(my-awesome-project)$ pyenv version
my-awesome-project (set by /Users/colinleefish/.pyenv/version)
在 PyCharm 中使用某個(gè)特定的項(xiàng)目環(huán)境
PyCharm 也是以獨(dú)立的項(xiàng)目來(lái)組織代碼的咒林。每個(gè)項(xiàng)目中熬拒,均可以設(shè)置一個(gè)已有的 Python 環(huán)境。只要指定這個(gè)項(xiàng)目的 Python 解釋器(interpretor垫竞,其實(shí)就是 Python 主程序)即可澎粟。
打開(kāi)任意環(huán)境,在菜單欄中通過(guò) “Run” - “Edit Configurations” 即可引導(dǎo)至項(xiàng)目環(huán)境設(shè)置界面欢瞪。
在 “Python interpreter” 處活烙,只要指定所需的 Python 環(huán)境,即是將整個(gè)環(huán)境遣鼓,以及依賴(lài)包都應(yīng)用在了這個(gè) PyCharm 項(xiàng)目上啸盏。此時(shí)便可以進(jìn)行開(kāi)發(fā)了。
延伸閱讀
pyenv 是受到 rbenv 啟發(fā)而產(chǎn)生的項(xiàng)目骑祟,后者主要解決了 Ruby 環(huán)境下的多版本隔離問(wèn)題回懦。pyenv 使用了一種叫做 Shim 的命令行黑科技气笙。技術(shù)細(xì)節(jié)在這里。更多文檔怯晕,可以訪問(wèn)該項(xiàng)目的 Github Wiki潜圃。
后記(2018-01-12)
在一次給朋友的 Mac 筆記本配置 pyenv 的過(guò)程中發(fā)現(xiàn):當(dāng)時(shí)使用 brew 下載的那個(gè)版本有點(diǎn)問(wèn)題,始終無(wú)法安裝新的 Python 版本舟茶。后來(lái)谭期,刪掉了 brew 的 pyenv,使用 pyenv 自帶的安裝工具(pyenv-installer)重新下載了之后吧凉,故障得以解決隧出。
后記(2018-02-02)
今天在一臺(tái)新電腦上安裝 pyenv 時(shí)發(fā)現(xiàn):使用 pyenv activate my_project
之后可能依然無(wú)法正確切換到預(yù)期的版本。具體的原因暫不清楚客燕,但本文中介紹的方法可能已經(jīng)有錯(cuò)誤鸳劳,或者不再有效,請(qǐng)讀者在使用時(shí)一定參照官方文檔來(lái)使用也搓。