Python: 配置pyenv virtualenv 環(huán)境

配置pyenv virtualenv 環(huán)境

本文節(jié)選自大媽的蟒營(yíng)課程筆記寂呛。

安裝python模塊時(shí)出錯(cuò),經(jīng)查,現(xiàn)有環(huán)境是py3, 而所安裝的模塊用的execfile是python2的,在python3中變成了exec(), 所以需要安裝Python2的環(huán)境蚊惯。其實(shí)大媽任務(wù)中已指明2.7.15, 我自作主張以為py3應(yīng)該可以用沒(méi)問(wèn)題。灵临。截型。

由于電腦中已有py2和py3,已混亂儒溉,很早被提醒pyenv很好用宦焦,一直拒絕開(kāi)始。

關(guān)于 pyenv, virtualenv, pyenv-virtualenv

先理一下三者的關(guān)系,異同波闹。

pyenv是管理環(huán)境中的Python版本的酝豪,比如可以有Python 2.7.10, Python 2.7.15, Python 3.6等。

virtualenv是管理某個(gè)具體Python版本的Packages(包)的精堕,比如可以有:

pyenv 2.7.10 virtualenv1, pyenv 2.7.10 virtualenv2

  • virtualenv1中:基于python2.7.10的django app需要用到django 1.6

  • virtualenv2中:基于Python2.7.10的django app需要用到django 2.6

以此來(lái)隔離app開(kāi)發(fā)環(huán)境寓调。

virtualenv的創(chuàng)建,其實(shí)是將系統(tǒng)當(dāng)前Python版本的解析器等復(fù)制了一份到本地app 文件夾中锄码,再加載app所需的各種包。這樣便和系統(tǒng)Python環(huán)境隔離開(kāi)了晌涕。

但是這樣有一個(gè)不足之處滋捶,如果開(kāi)發(fā)其他的app也要用到類(lèi)似的環(huán)境,就需要在新的app folder里面重新創(chuàng)建一個(gè)virtualenv余黎,再同樣加載所需的包重窟。這樣就達(dá)不到類(lèi)似編程中的復(fù)用(Reuse)效果。

所以又有了Pyenv-virtualenv, 直接在系統(tǒng)環(huán)境下創(chuàng)建某個(gè)Python版本的多個(gè)virtual環(huán)境惧财,各賦予一個(gè)名字巡扇。當(dāng)開(kāi)發(fā)各種app時(shí):

  • 如有直接可用的virtual環(huán)境,直接調(diào)用之垮衷。
  • 如無(wú)現(xiàn)有可用的厅翔,pyenv-virtualenv 新創(chuàng)建一個(gè),然后調(diào)用之搀突。

使用pyenv搭建python2.7.15

官方github:pyenv/pyenv: Simple Python version management

pyenv全部可用命令:pyenv/COMMANDS.md at master · pyenv/pyenv

安裝pyenv:(Mac)

brew install pyenv

查看所有pyenv命令:

pyenv commands

查看python 2.7.15是否可安裝

pyenv install --list

pyenv versions 查看刀闷,2.7.15在列,OK

* system (set by /Users/test/.pyenv/version)
  2.7.15

方便起見(jiàn)仰迁,先將py2.7.15設(shè)為全局環(huán)境

pyenv global 2.7.15

pyenv version:顯示目前環(huán)境中的確實(shí)是2.7.15

2.7.15 (set by /Users/test/.pyenv/version)

以后如需要甸昏,再單獨(dú)設(shè)local環(huán)境,如:

pyenv local 3.6

至此以為一切OK了徐许,但是在命令行里跑python,顯示的卻是系統(tǒng)自帶的2.7.10施蜜,咋回事?

Python 2.7.10 (default, Aug 17 2018, 17:41:52) 

嘗試下pyenv local雌隅,依然如此翻默,不得其解ing。澄步。冰蘑。待嘗試pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv).【解決方案見(jiàn)下文】

安裝pyenv-virtualenv

pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)

為啥有了pyenv, virtualenv, 又出來(lái)個(gè)結(jié)合版?

The main difference is that :

  • pyenv : copies an entire Python installation every time
    you create a new pyenv version.
  • In contrast, virtualenv makes use of
    symbolic links to decrease the size of the virtualenv’s.
  • pyenv-virtualenv: adds complete virtualenv functionality to pyenv:

—— pyenv Tutorial - Guides - Resources - Amaral Lab

安裝pyenv-virtualenv on Mac

brew install pyenv-virtualenv

使用:

準(zhǔn)備建一個(gè)專(zhuān)門(mén)用于camp的2.7.15環(huán)境村缸,運(yùn)行:

pyenv virtuanenv 2.7.15 camp

看看裝完什么情況:

pyenv versions
pyenv: version `2.7.15/envs/camp_orphan' is not installed (set by /Users/gitlab.com.camp/orphan/.python-version)
  system
  camp
  2.7.15
  2.7.15/envs/camp

坑們

  • Mac上安裝 python 2.7.15 失敗報(bào)錯(cuò):
ERROR: The Python zlib extension was not compiled. Missing the zlib?

通過(guò)Stack Overflow 找到官方wiki Common build problems · pyenv/pyenv Wiki

解決:

brew install zlib

Not working. 再試祠肥,因?yàn)槲业膍ac是 Mojave or higher (10.14+)

you will also need to install the additional SDK headers

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

再重新安裝2.7.15 成功。

  • pyenv 環(huán)境中運(yùn)行 python 顯示的是系統(tǒng)python版本

運(yùn)行:pyenv global 2.7.15后,pyenv version顯示正常為2.7.15, 但是再運(yùn)行 python卻顯示為系統(tǒng)本地的python 2.7.10:

Python 2.7.10 (default, Aug 17 2018, 17:41:52) 

嘗試下pyenv local仇箱,依然如此县恕,不得其解ing。剂桥。忠烛。

問(wèn)題解決

在~/.bash_profile中添加一下幾行,并保存

export PATH="~/.pyenv/bin:$PATH"    
eval "$(pyenv init -)"    
eval "$(pyenv virtualenv-init -)"  

運(yùn)行python权逗,依然是2.7.10美尸,而不是2.7.15。而且我的folder前面依然是光禿禿的斟薇,沒(méi)有出現(xiàn)類(lèi)似(2.7.15)這種虛擬環(huán)境的標(biāo)識(shí)师坎。

想著是不是virtualenv沒(méi)有成功activate呢?試著手動(dòng)去activate:

pyenv activate 2.7.15/envs/camp

哈堪滨,報(bào)錯(cuò)了

Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.

再運(yùn)行

pyenv shell 2.7.15/envs/camp

有點(diǎn)線索了胯陋,結(jié)果提示:

pyenv: shell integration not enabled. Run `pyenv init' for instructions.

運(yùn)行 pyenv init后,有眉目了:

# Load pyenv automatically by appending
# the following to ~/.bash_profile:

eval "$(pyenv init -)"

原來(lái)是袱箱,我雖然在~/.bash_profile文件中加入了這一行遏乔,但這個(gè)并未生效,我還需要運(yùn)行

source ~/.bash_profile

現(xiàn)在发笔,看到了virtual環(huán)境的標(biāo)識(shí)了盟萨,自動(dòng)activate成功:

(2.7.15/envs/camp) 

現(xiàn)在再運(yùn)行python, 便是2.7.15了。

待解問(wèn)題(已解決)

pyenv install 3.7.0后了讨,切換到 pyenv local 3.7.0, 運(yùn)行 python, 顯示仍然是 2.7...

找原因:

剛終于認(rèn)真去看了pyenv/pyenv: Simple Python version management官方文檔鸯旁,其中提到了一點(diǎn):

Directories in PATH are searched from left to right, so a matching executable in a directory at the beginning of the list takes precedence over another one at the end

我查看了下我的 PATH,最左面竟然是 /usr/local/bin: /usr/bin量蕊,系統(tǒng)自帶的python都在這里面了铺罢。

解決:

所以我的解決方案:刪了這倆(因?yàn)楹竺孢€有這倆)。現(xiàn)在OK了残炮。

現(xiàn)在再理解一下 pyenv 運(yùn)行命令的順序:PATH 是第一位的韭赘。

So with pyenv installed, when you run, say, pip, your operating system will do the following:
Search your PATH for an executable file named pip
Find the pyenv shim named pip at the beginning of your PATH
Run the shim named pip, which in turn passes the command along to pyenv

參考:

怎么才能放飛自我的玩兒Python · Yixuan

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邀层,一起剝皮案震驚了整個(gè)濱河市坡氯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌五嫂,老刑警劉巖苞冯,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袖牙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舅锄,警方通過(guò)查閱死者的電腦和手機(jī)鞭达,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人畴蹭,你說(shuō)我怎么就攤上這事坦仍。” “怎么了叨襟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵繁扎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我糊闽,道長(zhǎng)梳玫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任右犹,我火速辦了婚禮汽纠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傀履。我一直安慰自己,他們只是感情好莉炉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布钓账。 她就那樣靜靜地躺著,像睡著了一般絮宁。 火紅的嫁衣襯著肌膚如雪梆暮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,043評(píng)論 1 291
  • 那天绍昂,我揣著相機(jī)與錄音啦粹,去河邊找鬼。 笑死窘游,一個(gè)胖子當(dāng)著我的面吹牛唠椭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忍饰,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贪嫂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了艾蓝?” 一聲冷哼從身側(cè)響起力崇,我...
    開(kāi)封第一講書(shū)人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赢织,沒(méi)想到半個(gè)月后亮靴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡于置,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年茧吊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饱狂,死狀恐怖曹步,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情休讳,我是刑警寧澤讲婚,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站俊柔,受9級(jí)特大地震影響筹麸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雏婶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一物赶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留晚,春花似錦酵紫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赋焕,卻和暖如春参歹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隆判。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工犬庇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侨嘀。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓臭挽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咬腕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埋哟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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