- pyenv簡單使用
- pipenv簡單使用
- pipenv使用例
因使用pipenv時也可能會使用到pyenv,所以把pyenv擺在前面,不過閱讀時不盡然要照此順序。若是時間有限,也可先看第三篇,先有個較全面的概觀,必要時再回頭看前二篇較細部的使用與解釋。
以下是第一篇內容。
pyenv簡單使用
摘要
pyenv會下載Python源碼來編譯並安裝。採用這樣的做法會比像〈Ubuntu 14.04安裝Python 3.5〉所提到的作法來的簡單,也不干擾到系統用的Python版本。本文展示環境是Ubuntu 18.04,使用bash。
pyenv功用
pyenv工具程式用來安裝、管理與使用多個Python版號。- 可輕易在多個不同Python版號之間做切換。
- 允許以環境變數來改變想用的Python版號。
- 支援個別專案指定的Python版號。
- 純粹由shell scripts製作,與shell結合使用(不是給Windows用的,Windows上另有pyenv-win可用,不在本文討論範圍)。
運作方式
pyenv會在系統路徑PATH中安插墊片(shim)執行碼以攔截Python相關命令,來判斷你的應用所指定的Python版號,並傳遞命令給正確的Python安裝。這指的是透過pyenv所安裝的Python版號。若不是透過pyenv而是以其它方法裝的,如Anaconda,則可能不在此列,且Anaconda也有可能成為系統用的版號;系統原有的可能也不納入,但可用($pyenv versions時不會出現,但$pyenv shell這類命令可用此版號)。
選擇Python版號的順序
執行shim時,會依以下順序來決定所用的Python版號:- PYENV_VERSION環境變數(若有指定的話)。可用 pyenv shell 設定當前shell session中的該環境變數。
- 目前目錄中應用指定的 .python-version 檔(若有的話)。可用 pyenv local 修改當前目錄的 .python-version 檔。
- 搜尋每個父層目錄,直到檔案系統的根,第一個找到的 .python-version 檔。
- 全局 $(pyenv root)/version 檔。可用 pyenv global 修改此檔案。若無此檔,則假定使用 "system" Python(即系統用的Python版)(換句話說,就是如果pyenv不在 PATH 時所執行的版號)。
找出Python安裝位置
pyenv決定了所用的Python版號後,將命令傳給相對應的Python安裝。每個Python的版號是安裝在位於$(pyenv root)/vesions中各自的目錄之下。
安裝/更新與移除
安裝
這裡採用作者提供的快速安裝方式[2]:
$ curl https://pyenv.run | bash
註:這方式會用到git。若系統中沒有,自行安裝:
$ sudo apt install git
.bashrc中加入:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
重啟shell以讓新設定值生效。
更新
$ pyenv update
移除
要完全移除pyenv之前,最好先確定一下目前以pyenv執行的Python應用都已停止。pyenv安裝於 $PYENV_ROOT (預設:~/.pyenv),將此目錄移除:
$ rm -rf ~/.pyenv
並從 .bashrc 中移除安裝時所加入的那三行。若只是要暫時停用pyenv,可將 .bashrc 中 pyenv init 那行註釋掉,讓新值生效後,Python應用程式就不受Python版號切換的影響,雖然pyenv仍可從CLI使用。
以pyenv安裝/移除各Python版號
安裝Python組建依賴
在安裝新Python版號之前,要先安裝編譯Python源碼所須的系統依賴[3],[4]:註:若以3.7版為例,編譯時所需的相關套件也可參考Docker Hub上的Python 3.7-slim-buster
$ sudo apt update
$ sudo apt install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
註:編譯Python 3.7時若沒有先裝好libffi-dev,會出現這樣的錯誤:
ModuleNotFoundError: No module named '_ctypes'
安裝Python版號
可以用 pyenv install --list 查看有哪些版號可用。以下方式安裝Python 3.7.4版進 $(pyenv root)/versions中:
$ pyenv install 3.7.4
移除不要的Python版號
$ pyenv uninstall <version>
或者,查看一下有哪些版號,將不要的版號之目錄整個移除掉:
$ pyenv versions
$ rm -rf ~/.pyenv/versions/<version>
命令參考
單獨 pyenv 指令可顯示簡易用法,以下是較常用的:- pyenv install:安裝一個Python版號。
- pyenv uninstall:移除指定的Python版號。
- pyenv versions:列出所有pyenv可用的Python版號。
- pyenv version:顯示目前Python版號與其所在。
- pyenv which <command>:顯示執行檔所在。
- pyenv whence <command>:列示有包含所給執行檔的所有Python版號。
- pyenv shell:設定或顯示本次shell使用期間所用的Python版號。
- pyenv local:設定或顯示本地應用指定的Python版號。
- pyenv global:設定或顯示全局Python版號。
- pyenv commands:列出所有pyenv可用的命令。
除了上面提過的,這裡僅提幾個簡單的使用,較完整的請見官方文件Command Reference[5]。
顯示/設置Python版號
pyenv shell | local | global 這三個命令的用法都有點類似,這裡就拿其中一個做說明。不加任何參數時為顯示版號:
$ pyenv local
設置使用一或多個版號,版號字串也可以是'system',表示系統用的Python版號。以下例子是3.7.4與2.7.9:
$ pyenv local 3.7.4 2.7.9
除了global之外,其餘兩個命令都可用 --unset 取消設置的版號:
$ pyenv local --unset
Environment variables
較常用的:- PYENV_VERSION
- PYENV_ROOT
以pyenv部署
在產品服務器上設置pyenv的方式與在開發時相同。細節請見Deploying with pyenv。參考
- Simple Python Version Management: pyenv
- pyenv installer
- pyenv wiki
- Common build problems
- Command Reference
沒有留言:
張貼留言