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也要用到類似的環(huán)境,就需要在新的app folder里面重新創(chuàng)建一個(gè)virtualenv,再同樣加載所需的包。這樣就達(dá)不到類似編程中的復(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è)專門用于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)類似(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容