使用 pyenv 在 macOS 上創(chuàng)建多版本且能隔離的 Python 環(huán)境(本文部分內(nèi)容已過(guò)時(shí))

和眾多 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è)置界面欢瞪。


項(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)使用也搓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涵紊,隨后出現(xiàn)的幾起案子傍妒,更是在濱河造成了極大的恐慌,老刑警劉巖摸柄,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤练,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驱负,警方通過(guò)查閱死者的電腦和手機(jī)嗦玖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跃脊,“玉大人宇挫,你說(shuō)我怎么就攤上這事±沂酰” “怎么了器瘪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绘雁。 經(jīng)常有香客問(wèn)我橡疼,道長(zhǎng),這世上最難降的妖魔是什么庐舟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任欣除,我火速辦了婚禮,結(jié)果婚禮上挪略,老公的妹妹穿的比我還像新娘历帚。我一直安慰自己废酷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布抹缕。 她就那樣靜靜地躺著澈蟆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卓研。 梳的紋絲不亂的頭發(fā)上趴俘,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音奏赘,去河邊找鬼寥闪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磨淌,可吹牛的內(nèi)容都是我干的疲憋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梁只,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缚柳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起搪锣,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秋忙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后构舟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體灰追,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年狗超,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弹澎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡努咐,死狀恐怖苦蒿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麦撵,我是刑警寧澤刽肠,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站免胃,受9級(jí)特大地震影響音五,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羔沙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一躺涝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦坚嗜、人聲如沸夯膀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诱建。三九已至,卻和暖如春碟绑,著一層夾襖步出監(jiān)牢的瞬間俺猿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工格仲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留押袍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓凯肋,卻偏偏與公主長(zhǎng)得像谊惭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侮东,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容