作者:pylixm
原文:https://pylixm.cc/posts/2016-06-19-Virtualenv-install.html
全文約 5044 字,讀完可能需要 7 分鐘。
配置環境:
CentOS release 6.8
pyenv 20160509
在工作開發中,一直使用 virtualenv 來管理python的包環境。很好的解決了不同項目使用不同python包的需求。對於多python版本的問題如何解決一直無解,雖然可以安裝多個版本的python,靠絕對路徑或靠創建虛擬環境的時候指定python( virtualenv -p)版本來解決,但總感覺不是那麼的優雅。
同事推薦了 pyenv ,一直沒用過,特從網上找了些資料試著配置了下,記錄如下。
pyenv vs virtualenvpyenv 是針對 python 版本的管理,通過修改環境變量的方式實現;
virtualenv 是針對python的包的多版本管理,通過將python包安裝到一個模塊來作為python的包虛擬環境,通過切換目錄來實現不同包環境間的切換。
pyenv 原理pyenv 的美好之處在於,它並沒有使用將不同的 $PATH 植入不同的 shell 這種高耦合的工作方式,而是簡單地在 $PATH 的最前面插入了一個墊片路徑(shims):
~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有對 Python 可執行文件的查找都會首先被這個 shims 路徑截獲,從而架空了後面的系統路徑。
pyenv 安裝使用自動安裝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
添加環境變量。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 - 創建墊片路徑(為所有已安裝的可執行文件 (如:~/.pyenv/versions//bin/) 創建 shims,因此,每當你增刪了 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 多版本環境管理方案,希望留言不吝賜教,在此,先謝過了!
題圖:pexels,CC0 授權。
點擊閱讀原文,查看更多 Python 教程和資源。