介紹
出于種種原因,很多人的電腦上會同時安裝很多個版本的 Python,比如會有 2.7 + 3.4。一般在 windows 下我們都可以通過使用絕對路徑的方式來繞過系統對 PATH 環境變量的查詢;在 Linux 下除了這種方式外,還可以在腳本檔案開頭顯示指定需要使用的解釋器,就像這樣:#!/usr/bin/env python2.7 或 #!usr/bin/env python3.4。一旦特定版本的解釋器被打開後,就不用再擔心 PATH 的問題了
對于上述問題的解決方案,更多人可能會首先想到 virtualenv。但與用于建立獨立包環境的 virtualenv 不同,pyenv 的作用僅限于維護不同版本的 Python。它的使用不依賴于 Python,是一個簡單、獨立的純 shell 腳本工具。pyenv 也以 pyenv-virtualenv 插件的形式支援 virtualenv,強烈建議使用。安裝後比較友善的是可以在你 cd 到項目目錄時自動切換相應的虛拟環境,而不用老是 source.
pyenv 在安裝和配置完畢後可以實作:一鍵(指令)切換全局、本地或目前 shell 使用的 Python 版本。
pyenv 原理
pyenv 的美好之處在于,他并沒有使用将不同的 PATH植入不同的shell這種高耦合的工作方式,而是簡單地在 PATH 的最前面插入了一個墊片路徑(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有對 Python 可執行檔案的查找都會首先被這個 shims 路徑截獲,進而架空了後面的系統路徑。
安裝pyenv
pyenv 的 github 頁面 提供了完整的安裝與使用指導,是以本文基本上就是對 Readme 的翻譯和解釋
手動安裝
手動安裝詳細步驟如下:
$mkdir ~/.pyenv
$git clone git://github.com/yyuu/pyenv.git .pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile #向 shell 添加 pyenv init 以啟用 shims 和指令補完功能
$ exec $SHELL
$ source ~/.bash_profile
這裡的 shell 配置檔案(~/.bash_profile)依不同Linux 而需作修改——Zsh:~/.zshenv;Ubuntu:~/.bashrc
自動安裝
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
pyenv 指令總結
詳細清單:https://github.com/yyuu/pyenv/blob/master/COMMANDS.md#command-reference
常用指令如下:
- pyenv versions:檢視目前 pyenv 可檢測到的所有版本,處于激活狀态的版本前以 * 标示。
- pyenv version:檢視目前處于激活狀态的版本,括号中内容表示這個版本是由哪條途徑激活的(global、local、shell)
- pyenv install:使用 python-build(一個插件) 安裝一個 Python 版本,到 $PYENV_ROOT/versions 路徑下。建議添加 -v 參數用于顯示細節。python-build 會首先嘗試從一個鏡像站點下載下傳包,此時可以去 /tmp/python-build.xxx 裡面關心一下下載下傳速度
- pyenv uninstall:解除安裝一個版本
- pyenv rehash:為所有已安裝的可執行檔案 (如:~/.pyenv/versions//bin/) 建立 shims,是以,每當你增删了 Python 版本或帶有可執行檔案的包(如 pip)以後,都應該執行一次本指令
- pyenv global:設定全局的 Python 版本,通過将版本号寫入 ~/.pyenv/version 檔案的方式。
- pyenv local:設定面向程式的本地版本,通過将版本号寫入目前目錄下的 .python-version 檔案的方式。通過這種方式設定的 Python 版本優先級較 global 高。pyenv 會從目前目錄開始向上逐級查找 .python-version 檔案,直到根目錄為止。若找不到,就用 global 版本。
- pyenv shell:設定面向 shell 的 Python 版本,通過設定目前 shell 的 PYENV_VERSION 環境變量的方式。這個版本的優先級比 local 和 global 都要高。–unset 參數可以用于取消目前 shell 設定的版本。
安裝pyenv-virtualenv
介紹
pyenv virtualenv是pyenv的插件,為UNIX系統上的Python virtualenvs提供pyenv virtualenv指令。
安裝步驟
$git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
$source ~/.bash_profile
實踐
多個Python版本快速切換
- 首先我們可以檢視一下有哪些版本的python 可以安裝:pyenv install –list
- 安裝:pyenv install -v 3.5.3(這個過程會比較漫長)
- pyenv versions (檢視所有版本)
$ pyenv versions
* system (set by /root/.pyenv/version)
- pyenv version(檢視目前版本)
系統中不同python版本切換的操作截圖如下:

利用virtualenv 建立虛拟python環境
- 建立一個3.5.3的環境:$ pyenv virtualenv 3.5.3 env353 (這條指令在本機上建立了一個名為env353的python虛拟環境,這個環境的真實目錄位于:~/.pyenv/versions/)
- 切換和使用新的python虛拟環境:$ pyenv activate env353
- 環境驗證
(env353) [email protected]:~# pyenv activate env353
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=' to simulate the behavior.
(env353) [email protected]:~# python --version
Python
(env353) [email protected]:~# pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip ()
setuptools ()
可以看到, python版本已經是3.5.3, 而且是在虛拟環境之中 (env353),這時可以對這個環境進行任意包的安裝,且不會對其他環境造成影響
- 離開環境:pyenv deactivate