MacOS 下利用 pyenv 管理Python 版本和虛擬環境

ryoma發表於2019-02-25

pyenv 介紹

pyenvPython 版本管理工具。pyenv 可以改變全域性的 Python 版本,安裝多個版本的 Python,設定目錄級別的 Python 版本,還能建立和管理 virtual python environments。所有的設定都是使用者級別的操作,不需要 sudo 命令。

pyenv 主要用來管理 Python 的版本,比如一個專案需要 Python 2.x,一個專案需要 Python 3.x。 而 virtualenv 主要用來管理 Python 包的依賴,不同專案需要依賴的包版本不同,則需要使用虛擬環境。

pyenv 原理簡介

pyenv 通過系統修改環境變數來實現 Python 不同版本的切換。而 virtualenv 通過將 Python 包安裝到一個目錄來作為 Python 包虛擬環境,通過切換目錄來實現不同包環境間的切換。

pyenv 的美好之處在於,它並沒有使用將不同的 PATH 植入不同的 shell 這種高耦合的工作方式,而是簡單地在 PATH 的最前面插入了一個墊片路徑(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有對 Python 可執行檔案的查詢都會首先被這個 shims 路徑截獲,從而使後方的系統路徑失效。

安裝之前

不同系統請參考 Common build problems,安裝必須的工具。

pyenv 安裝

根據官網的 安裝說明 或者 自動安裝。 如果使用 Mac 直接使用 Homebrew。安裝成功後記得在 .bashrc 或者 .bash_profile 中新增三行來開啟自動補全。

# 根據自己的環境配置
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
複製程式碼

自動安裝

pyenv 提供了自動安裝的工具,執行命令安裝即可:

curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
複製程式碼

保證系統有 git,否則需要新安裝 git

手動安裝

如果想要更加詳細的瞭解安裝過程,可以使用手動安裝。將 pyenv 檢出到你想安裝的目錄。建議路徑為:$HOME/.pyenv

cd ~
git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
複製程式碼

新增環境變數 PYENV_ROOT 指向 pyenv 檢出的根目錄,並向 $PATH 新增 $PYENV_ROOT/bin 以提供訪問 pyenv 命令的路徑。

這裡的 shell 配置檔案(~/.bash_profile)依不同 Linux 而需作修改,如果使用 zsh 則需要相應的配置 ~/.zshrc

在使用 pyenv 之後使用 pip 安裝的第三方模組會自動安裝到當前使用 Python 版本下,不會和系統模組產生衝突。使用 pip 安裝模組之後,如果沒有生效,記得使用 pyenv rehash 來更新墊片路徑。

pyenv 常用命令

使用 pyenv commands 顯示所有可用命令

Python 配置

# 檢視系統當前安裝的python列表
pyenv versions

# 列出可安裝版本
pyenv install --list 

# 安裝指定版本 Python
pyenv install -v 3.5.1

# 解除安裝指定版本 Python
pyenv uninstall 2.7.3

# 顯示當前python安裝路徑
pyenv which python 

# 建立墊片路徑
# 為所有已安裝的可執行檔案建立 shims
# 如:~/.pyenv/versions/*/bin/*
# 每當你增刪了 Python 版本或帶有可執行檔案的包(如 pip)以後,都應該執行一次本命令
pyenv rehash
複製程式碼

Python 切換

#  設定全域性的 Python 版本,通過將版本號寫入 ~/.pyenv/version 檔案的方式
pyenv global <版本號>

# 設定面向程式的本地版本,通過將版本號寫入當前目錄下的 .python-version 檔案的方式。通過這種方式設定的 Python 版本優先順序較 global 高。
# pyenv 會從當前目錄開始向上逐級查詢 .python-version 檔案,直到根目錄為止。若找不到,就用 global 版本。
pyenv local <版本號>

# 設定面向 shell 的 Python 版本,通過設定當前 shell 的 PYENV_VERSION 環境變數的方式。這個版本的優先順序比 local 和 global 都要高。
pyenv shell <版本號>

# --unset 引數可以用於取消當前 shell 設定的版本。
pyenv shell --unset
複製程式碼

Python 優先順序

shell > local > global

pyenv-virtualenv

pyenv-virtualenvpyenv 下基於 virtualenv 的一款外掛,通過 pyenv-virtualenv 外掛可以很好的和 virtualenv 結合。

安裝

使用自動安裝 pyenv 後,它會自動安裝部分外掛,其中包括了 pyenv-virtualenv

若使用 Homebrew 進行安裝,則可使用命令 brew install pyenv-virtualenv 安裝 pyenv-virtualenv 外掛。

這樣安裝之後需要執行如下配置:

# 使用 zsh shell
vim ~/.zshrc

# 使用系統預設
vim ~/.bash_profile

# 在 `.zshrc` 或 `.bash_profile` 檔案最後寫入:
# pyenv-virtualenv
if which pyenv-virtualenv-init > /dev/null;
  then eval "$(pyenv virtualenv-init -)";
fi

# 使配置生效
source ~/.zshrc
# or
source ~/.bash_profile
複製程式碼

使用

# 建立虛擬環境
# 若不指定 Python 版本,預設使用當前環境 Python 版本
pyenv virtualenv <Python 版本號> <虛擬環境名稱>

# 列出當前虛擬環境
pyenv virtualenvs

# 啟用虛擬環境
pyenv activate <虛擬環境名稱>

# 退出虛擬環境
pyenv deactivate

# 刪除虛擬環境
pyenv uninstall <虛擬環境名稱>
複製程式碼

Tips:更換 pip 源

因為國內網路環境,如果在區域網內 pip 下載慢,可以嘗試使用阿里雲提供的映象,建立 vim ~/.pip/pip.conf,然後填入:

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com
複製程式碼

更多 pip 國內源:

豆瓣:http://pypi.douban.com 阿里雲:http://mirrors.aliyun.com/pypi/simple 清華大學:https://pypi.tuna.tsinghua.edu.cn/simple

參考

相關文章