使用 pyenv + virtualenv 打造多版本 Python 開發環境

本文最先發表於我的博客Pylixm'wiki: http://pylixm.cchtml

配置環境:python

  • CentOS release 6.8linux

  • pyenv 20160509git

在工做開發中,一直使用 virtualenv 來管理python的包環境。很好的解決了不一樣項目使用不一樣python包的需求。對於多python版本的問題如何解決一直無解,雖然能夠安裝多個github

版本的python,靠絕對路徑或靠建立虛擬環境的時候指定python(virtualenv -p)版原本解決,但總感受不是那麼的優雅。同事推薦了 pyenv ,一直沒用過,特從網上找了些資料試着配置了下,記錄以下。shell

pyenv vs virtualenv

pyenv 是針對 python 版本的管理,經過修改環境變量的方式實現;bash

virtualenv 是針對python的包的多版本管理,經過將python包安裝到一個模塊來做爲python的包虛擬環境,經過切換目錄來實現不一樣包環境間的切換。curl

pyenv 原理

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

pyenv 安裝使用

自動安裝

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

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

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

$ 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

向 shell 添加 pyenv init 以啓用 shims 和命令補完功能

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

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

重啓 shell(由於修改了 $PATH)

$ exec $SHELL

pyenv 經常使用命令

python配置

  • $ pyenv versions -- 查看系統當前安裝的python列表

  • $ pyenv install -v 3.5.1 -- 安裝python

  • $ pyenv uninstall 2.7.3 -- 卸載python

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

python切換

  • $ pyenv global 3.4.0 -- 設置全局的 Python 版本,經過將版本號寫入 ~/.pyenv/version 文件的方式。

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

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

  • $ pyenv shell --unset

python優先級

shell > local > global

pyenv 插件: pyenv-virtualenv

安裝

使用自動安裝pyenv 後,它會自動安裝部分插件,經過pyenv-virtualenv 插件能夠很好的和 virtualenv 結合:

[root@linux3311 ~]# cd .pyenv/plugins/
[root@linux3311 plugins]# ll
insgesamt 24
drwxr-xr-x. 4 root root 4096 19. Jun 05:17 pyenv-doctor
drwxr-xr-x. 5 root root 4096 19. Jun 05:18 pyenv-installer
drwxr-xr-x. 4 root root 4096 19. Jun 05:18 pyenv-update
drwxr-xr-x. 7 root root 4096 19. Jun 05:18 pyenv-virtualenv
drwxr-xr-x. 4 root root 4096 19. Jun 05:18 pyenv-which-ext
drwxr-xr-x. 5 root root 4096 19. Jun 05:17 python-build

使用

  • 建立虛擬環境 $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
    若不指定python 版本,會彙報認使用當前環境python版本。

  • 列出當前虛擬環境 pyenv virtualenvs

  • 激活虛擬環境 pyenv activate

  • 退出虛擬環境 pyenv deactivate

  • 刪除虛擬環境 pyenv uninstall my-virtual-env

使用pyenv 來管理python,使用 pyenv-virtualenv 插件來管理多版本 python包。

此時,還需注意,當咱們將項目運行的 env 環境部署到生產環境時,因爲咱們的python 包是依賴python 的,須要注意生產環境的python版本問題(詳見 這裏)。

以上爲我的拙見,歡迎小夥伴們留言交流。小夥伴們如有更好的python 多版本環境管理方案,但願留言不吝賜教,在此,先謝過了!

參考

pyenv 下載地址 這裏
virtualenv 中文文檔地址 這裏
http://my.oschina.net/lionets/blog/267469
https://github.com/yyuu/pyenv-virtualenv

相關文章
相關標籤/搜索