配置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-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