創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2019年9月8日 星期日

pyenv簡單使用

本月打算發布與pipenv相關的文章,由於內容稍多,所以安排分成三篇:
  1. pyenv簡單使用
  2. pipenv簡單使用
  3. pipenv使用例
這些內容是從之前撰寫的內部文件節錄出來並做調整,也許不詳盡,但文後會有參考連結可供讀者查閱原始說明文件。

因使用pipenv時也可能會使用到pyenv,所以把pyenv擺在前面,不過閱讀時不盡然要照此順序。若是時間有限,也可先看第三篇,先有個較全面的概觀,必要時再回頭看前二篇較細部的使用與解釋。

以下是第一篇內容。

pyenv簡單使用

摘要

pyenv會下載Python源碼來編譯並安裝。採用這樣的做法會比像〈Ubuntu 14.04安裝Python 3.5〉所提到的作法來的簡單,也不干擾到系統用的Python版本。

本文展示環境是Ubuntu 18.04,使用bash。

pyenv功用

pyenv工具程式用來安裝、管理與使用多個Python版號。
  1. 可輕易在多個不同Python版號之間做切換。
  2. 允許以環境變數來改變想用的Python版號。
  3. 支援個別專案指定的Python版號。
  4. 純粹由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版號:
  1. PYENV_VERSION環境變數(若有指定的話)。可用 pyenv shell 設定當前shell session中的該環境變數。
  2. 目前目錄中應用指定的 .python-version 檔(若有的話)。可用 pyenv local 修改當前目錄的 .python-version 檔。
  3. 搜尋每個父層目錄,直到檔案系統的根,第一個找到的 .python-version 檔。
  4. 全局 $(pyenv root)/version 檔。可用 pyenv global 修改此檔案。若無此檔,則假定使用 "system" Python(即系統用的Python版)(換句話說,就是如果pyenv不在 PATH 時所執行的版號)。
可以同時擁有多種不同Python版號,方便像tox這類的使用情況。先以pyenv install所想用的Python版號,再來設置版號使用順序。

找出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可用的命令。
pyenv help 可看指定命令的較詳細資訊。

除了上面提過的,這裡僅提幾個簡單的使用,較完整的請見官方文件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

參考

  1. Simple Python Version Management: pyenv
  2. pyenv installer
  3. pyenv wiki
  4. Common build problems
  5. Command Reference
update: 2020-9-18

沒有留言:

張貼留言