Linux 下的 Python 多版本管理(pyenv)

#簡介python

提到 Python 環境管理,更多人可能會首先想到 virtualenv。但與用於建立獨立包環境的 virtualenv 不一樣,pyenv 的做用僅限於維護不一樣版本的 Python。它的使用不依賴於 Python,是一個簡單、獨立的純 shell 腳本工具。pyenv 也以 pyenv-virtualenv 插件的形式支持 virtualenv,強烈建議使用。安裝後比較方便的是能夠在你 cd 到項目目錄時自動切換相應的虛擬環境,而不用總是 source.git

<br /> ###需求 ------------ 出於種種緣由,不少人的電腦上會同時安裝不少個版本的 Python,好比會有 2.7 + 3.4。通常在 windows 下咱們均可以經過使用絕對路徑的方式來繞過系統對 PATH 環境變量的查詢;在 Linux 下除了這種方式外,還能夠在腳本文件開頭顯示指定須要使用的解釋器,就像這樣:`#!/usr/bin/env python2.7` 或 `#!usr/bin/env python3.4`。一旦特定版本的解釋器被打開後,就不用再擔憂 PATH 的問題了。github

就是有點麻煩。因此爲了能讓用戶爲所欲爲地使用不一樣版本的諸如 python、pip、django-admin.py 這樣的命令,本篇的主題,pyenv 就被開發出來了。pyenv 在安裝和配置完畢後能夠實現:一鍵(命令)切換全局、本地或當前 shell 使用的 Python 版本。 <br /> ###原理

pyenv 的美好之處在於,他並無使用將不一樣的 $PATH 植入不一樣的 shell 這種高耦合的工做方式,而是簡單地在 $PATH 的最前面插入了一個墊片路徑(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。全部對 Python 可執行文件的查找都會首先被這個 shims 路徑截獲,從而架空了後面的系統路徑。 <br /> #安裝sql

pyenv 的 github 頁面 提供了完整的安裝與使用指導,因此本文基本上就是對 Readme 的翻譯和解釋。 <br /> ###軟件依賴

Linux 下安裝 pyenv 前須要作一些準備工做,詳情參考 Requirements 頁面。例如 UP 使用的 Ubuntu 系統就須要先執行以下命令:sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm <br /> ###自動安裝

做者很親切地提供了一個自動安裝工具:shell

$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

若是想本身手動安裝並進行配置的話,可參考下面的步驟。 <br /> ###Github 檢出

  1. 將 pyenv 檢出到你想安裝的目錄。建議路徑爲:$HOME/.pyenvdjango

    $ cd
     $ git clone git://github.com/yyuu/pyenv.git .pyenv

<br /> 2. 添加環境變量。`PYENV_ROOT` 指向 pyenv 檢出的根目錄,並向 `$PATH` 添加 `$PYENV_ROOT/bin` 以提供訪問 `pyenv` 這條命令的路徑windows

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
	$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

這裏的 shell 配置文件(`~/.bash_profile`)依不一樣 Linux 而需做修改——Zsh:`~/.zshenv`;Ubuntu:`~/.bashrc`

<br /> 3. 向 shell 添加 `pyenv init` 以啓用 shims 和命令補完功能bash

$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

配置文件的位置同上一條同樣須要修改

<br /> 4. 重啓 shell(由於修改了 `$PATH`)python2.7

$ exec $SHELL

<br /> #使用curl

pyenv 總共也就 11 條不一樣的命令,詳情可參見:Command Reference。下面就最重要的幾(8)條進行說明: <br /> ###pyenv versions

查看當前 pyenv 可檢測到的全部版本,處於激活狀態的版本前以 * 標示。

$ pyenv versions
 2.5.6
 2.6.8
*2.7.6 (set by /home/yyuu/.pyenv/version)
 3.3.3
 jython-2.5.3
 pypy-2.2.1

<br /> ###pyenv version ------------ 查看當前處於激活狀態的版本,括號中內容表示這個版本是由哪條途徑激活的(global、local、shell)

$ pyenv version
2.7.6 (set by /home/yyuu/.pyenv/version)

<br /> ###pyenv install ------------ 使用 python-build(一個插件) 安裝一個 Python 版本,到 `$PYENV_ROOT/versions` 路徑下。

$ pyenv install -v 2.7.3

建議添加 -v 參數用於顯示細節。python-build 會首先嚐試從一個鏡像站點下載包,此時能夠去 /tmp/python-build.xxx 裏面關心一下下載速度。若是太慢,能夠直接在 shell 裏 ctrl-c 終止這次下載,而後 python-build 會自動去 python.org/ftp 下載。不必定哪一個更快。 <br /> ###pyenv uninstall

卸載一個版本

$ pyenv uninstall 2.7.3

<br /> ###pyenv rehash ------------ 爲全部已安裝的可執行文件 (如:`~/.pyenv/versions/*/bin/*`) 建立 shims,所以,每當你增刪了 Python 版本或帶有可執行文件的包(如 pip)之後,都應該執行一次本命令

$ pyenv install 2.7.3
$ pyenv rehash

<br /> ###pyenv global ------------ 設置全局的 Python 版本,經過將版本號寫入 `~/.pyenv/version` 文件的方式。

$ pyenv global 3.4.0

<br /> ###pyenv local ------------ 設置面向程序的本地版本,經過將版本號寫入當前目錄下的 `.python-version` 文件的方式。經過這種方式設置的 Python 版本優先級較 global 高。pyenv 會從當前目錄開始向上逐級查找 `.python-version` 文件,直到根目錄爲止。若找不到,就用 global 版本。

$ pyenv local 2.7.3

<br /> ###pyenv shell ------------ 設置面向 shell 的 Python 版本,經過設置當前 shell 的 `PYENV_VERSION` 環境變量的方式。這個版本的優先級比 local 和 global 都要高。`--unset` 參數能夠用於取消當前 shell 設定的版本。

$ pyenv shell pypy-2.2.1
$ pyenv shell --unset

吐一句:OSC 對 Markdown 的着色處理感受不如 github 上的灰度來得乾淨啊,本文我已經盡力了~

相關文章
相關標籤/搜索