提到 Python 環(huán)境管理,更多人可能會首先想到 virtualenv。但與用于創(chuàng)建獨(dú)立包環(huán)境的 virtualenv 不同,pyenv 的作用僅限于維護(hù)不同版本的 Python。它的使用不依賴于 Python,是一個簡單、獨(dú)立的純 shell 腳本工具。pyenv 也以 pyenv-virtualenv 插件的形式支持 virtualenv,用戶可以按需選擇是否使用,本文將不對此插件進(jìn)行討論。
關(guān)于適用平臺的問題,pyenv 是支持 OSX 等類 Unix 操作系統(tǒng)的,標(biāo)題只提了 Linux 是因?yàn)槲覜]有 MAC。。。
出于種種原因,很多人的電腦上會同時安裝很多個版本的 Python,比如會有 2.7 + 3.4。一般在 windows 下我們都可以通過使用絕對路徑的方式來繞過系統(tǒng)對 PATH 環(huán)境變量的查詢;在 Linux 下除了這種方式外,還可以在腳本文件開頭顯示指定需要使用的解釋器,就像這樣:#!/usr/bin/env python2.7
或 #!usr/bin/env python3.4
。一旦特定版本的解釋器被打開后,就不用再擔(dān)心 PATH 的問題了。
就是有點(diǎn)麻煩。所以為了能讓用戶隨心所欲地使用不同版本的諸如 python、pip、django-admin.py 這樣的命令,本篇的主題,pyenv 就被開發(fā)出來了。pyenv 在安裝和配置完畢后可以實(shí)現(xiàn):一鍵(命令)切換全局、本地或當(dāng)前 shell 使用的 Python 版本。
pyenv 的美好之處在于,他并沒有使用將不同的 $PATH
植入不同的 shell 這種高耦合的工作方式,而是簡單地在 $PATH
的最前面插入了一個墊片路徑(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin
。所有對 Python 可執(zhí)行文件的查找都會首先被這個 shims 路徑截獲,從而架空了后面的系統(tǒng)路徑。
pyenv 的 github 頁面 提供了完整的安裝與使用指導(dǎo),所以本文基本上就是對 Readme 的翻譯和解釋。
Linux 下安裝 pyenv 前需要做一些準(zhǔn)備工作,詳情參考 Requirements 頁面。例如 UP 使用的 Ubuntu 系統(tǒng)就需要先執(zhí)行如下命令:sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm
作者很親切地提供了一個自動安裝工具:
如果想自己手動安裝并進(jìn)行配置的話,可參考下面的步驟。
將 pyenv 檢出到你想安裝的目錄。建議路徑為:$HOME/.pyenv
添加環(huán)境變量。PYENV_ROOT
指向 pyenv 檢出的根目錄,并向 $PATH
添加 $PYENV_ROOT/bin
以提供訪問 pyenv
這條命令的路徑
這里的 shell 配置文件(~/.bash_profile
)依不同 Linux 而需作修改——Zsh:~/.zshenv
;Ubuntu:~/.bashrc
向 shell 添加 pyenv init
以啟用 shims 和命令補(bǔ)完功能
配置文件的位置同上一條一樣需要修改
重啟 shell(因?yàn)樾薷牧?$PATH
)
pyenv 總共也就 11 條不同的命令,詳情可參見:Command Reference。下面就最重要的幾(8)條進(jìn)行說明:
查看當(dāng)前 pyenv 可檢測到的所有版本,處于激活狀態(tài)的版本前以 * 標(biāo)示。
查看當(dāng)前處于激活狀態(tài)的版本,括號中內(nèi)容表示這個版本是由哪條途徑激活的(global、local、shell)
使用 python-build(一個插件) 安裝一個 Python 版本,到 $PYENV_ROOT/versions
路徑下。
建議添加 -v 參數(shù)用于顯示細(xì)節(jié)。python-build 會首先嘗試從一個鏡像站點(diǎn)下載包,此時可以去 /tmp/python-build.xxx
里面關(guān)心一下下載速度。如果太慢,可以直接在 shell 里 ctrl-c
終止此次下載,然后 python-build 會自動去 python.org/ftp
下載。不一定哪個更快。
卸載一個版本
為所有已安裝的可執(zhí)行文件 (如:~/.pyenv/versions/*/bin/*
) 創(chuàng)建 shims,因此,每當(dāng)你增刪了 Python 版本或帶有可執(zhí)行文件的包(如 pip)以后,都應(yīng)該執(zhí)行一次本命令
設(shè)置全局的 Python 版本,通過將版本號寫入 ~/.pyenv/version
文件的方式。
設(shè)置面向程序的本地版本,通過將版本號寫入當(dāng)前目錄下的 .python-version
文件的方式。通過這種方式設(shè)置的 Python 版本優(yōu)先級較 global 高。pyenv 會從當(dāng)前目錄開始向上逐級查找 .python-version
文件,直到根目錄為止。若找不到,就用 global 版本。
設(shè)置面向 shell 的 Python 版本,通過設(shè)置當(dāng)前 shell 的 PYENV_VERSION
環(huán)境變量的方式。這個版本的優(yōu)先級比 local 和 global 都要高。--unset
參數(shù)可以用于取消當(dāng)前 shell 設(shè)定的版本。
吐一句:OSC 對 Markdown 的著色處理感覺不如 github 上的灰度來得干凈啊,本文我已經(jīng)盡力了~
聯(lián)系客服