顯示廣告
隱藏 ✕
看板 Programming
作者 INFOLINK (INFOLINK)
標題 [Python] 建置 Python 3.9 開發環境
時間 2021-01-15 Fri. 16:28:58


受限於 BBS 的格式不易放圖和程式碼,完整的含圖片全文請見 https://cutt.ly/ojsCt8o

## Python 的版本

Python 進入 3.x 的時代也好幾年了,但至今 Python 2.7.x 即便已經不再維護,
它還是以某種殭屍的型態存活在各個陳年專案上,對一個沒有舊包袱的新專案來說,
Python 3.x 的 x 就必須是在開立專案時要考慮的問題,在 Python 的網站上有
Python 各版本目前的生命週期表:

(圖片)

可以看到從 Python 3.7 起就維持一年跳一個次版號的頻率,並維持著五年的生命週期。

在確認過 Python 本身的生命週期後,另外一個考慮的點是 Python 3.6 ~ 3.9
之間是否有淘汰某些舊的語法、標準庫、功能,如果有的話那必須進一步考慮到新專案
的依賴套件是不是有用到那些被淘汰的功能,幸好 Python 3.6 ~ 3.9 主要都是增
加新的功能或語法,不太有淘汰舊功能的問題,因此對於新成立的專案,採用較新的
Python 3.9 看起來是個不太有風險的決定。

補充一個消息,從 Python 3.9 的下一版起會淘汰設計給保留與 Python 2.7
相容的舊標準庫/函式/API。

## Python 3.9 開發環境

目前所有的 Linux 發行版,內建的 Python 版本各有不同,如果您的 Linux 較新,
已經是內建 Python 3.9 的話那恭喜您本文對您是無用處的,本文完。

以常見的 Linux 發行版來說,內建的 Python 如下:

- Ubuntu 20.04 LTS: Python 3.8.2
- Linux Mint 20: Python 3.8.2
- Pop!_OS 20.04: Python 3.8.2
- Debian 10: Python 3.7.3
- Elementary OS 5.1.7: Python 3.6.7
- CentOS 8.2.2004: Python 3.8.0

上面的列表涵蓋了主要的桌面端與伺服器端的 Linux 發行版,可以看到今年十月才發布的
Python 3.9 理所當然地尚未被納入。

如果是 macOS Catalina,內建的 Python 版本分別是 2.7.16 和 3.8.6。

下面開始我們的 Python 3.9 開發環境建置之旅。

### 多版本 Python 管理

想要把 Python 3.9 裝起來,當然不能簡單粗暴地把作業系統預載的 Python 取代掉,
這樣做會造成後續系統維護與更新上的許多問題。在這邊我們利用 pyenv 這個多版本
Python 管理器來幫助我們安裝一個與系統預載 Python 並行存在的 Python 3.9。

pyenv 不僅能幫我們安裝多版本的 Python,也提供了 Python 版本切換與管理的能力,
並且這些由 pyenv 管理的 Python 版本彼此間都互相獨立,包括 Python 之下的套件/模
組也都是獨立的,這樣的好處就是讓一台電腦的開發環境可以既多元又單純,多元的是 Python
版本,讓新舊專案都可以有適用的 Python 版本;單純的是各版次 Python 下的套件與模組,
並不會受到別的版次的 Python 所影響。

根據 pyenv 的要求,需要安裝編譯 Python 所必須的其它系統套件,因為 pyenv 安裝
Python 的機制是把指定版本的 Python 源碼抓下來在自己的電腦內編譯,因此必須安裝那
些編譯工具,才可以順利的編譯出 Python。

對 Debian / Elementary OS / Pop!_OS / Linux Mint / Ubuntu 等同一脈的
Linux 發行版,需要安裝下列套件:

``
> sudo apt install --no-install-reocmmends \
make \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
curl \
llvm \
libncurses5-dev \
libncursesw5-dev  \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
libxml2-dev \
libxmlsec1-dev
``

對 macOS Catalina,需要先安裝 Homebrew 以及 Command Line Tools
後安裝下列套件:

``
> brew install openssl readline sqlite3 xz zlib bzip2
``

如果是其它 Linux 發行版或其它作業系統,請參考 pyenv 的文件
「Suggested build environment」一節安裝所需系統套件。(像
這樣的套件依賴關係就像粽子串一樣,一個牽一個,全部拉起來就是一大
堆⋯⋯。)

上面的系統套件裝完後,終於可以裝 pyenv 了,Linux 安裝 pyenv
有現成的安裝腳本可以使用:

``
> curl https://pyenv.run | bash
``

如果是 macOS,則是利用 Homebrew 安裝 pyenv:

``
> brew install pyenv
``

然後把 pyenv 加入 shell 的設定檔內,讓我們進入 shell 時就先執行
pyenv init 的命令:

``
> echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc
``

以及設定讓編譯 Python 時取用 Homebrew 版的 ziplib 和 bzip2
函式庫:

``
> echo 'export PATH="/usr/local/opt/bzip2/bin:$PATH"' >> ~/.zshrc
> export LDFLAGS="-L/usr/local/opt/zlib/lib -L/usr/local/opt/bzip2/lib"
> export CPPFLAGS="-I/usr/local/opt/zlib/include -I/usr/local/opt/bzip3/include"
``

上面是以 Zsh 為例,如果是其他 shell 要自行類推修改,完整的 pyenv
安裝流程和注意事項最好還是看 pyenv 的文件。

安裝完之後,如果 pyenv 有被正確的加進 $PATH 內,那麼執行 pyenv
應該可以看到如下的說明畫面:

``
> pyenvpyenv 1.2.21
Usage: pyenv <command> [<args>]Some useful pyenv commands are:
   activate    Activate virtual environment
   commands    List all available pyenv commands
   deactivate   Deactivate virtual environment
   doctor      Verify pyenv installation and development tools to build pythons.
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command
   hooks       List hook scripts for a given pyenv command
   init        Configure the shell environment for pyenv
   install     Install a Python version using python-build
   local       Set or show the local application-specific Python version(s)
   prefix      Display prefix for a Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   root        Display the root directory where versions and shims are kept
   shell       Set or show the shell-specific Python version
   shims       List existing pyenv shims
   uninstall   Uninstall a specific Python version
   version     Show the current Python version(s) and its origin
   --version   Display the version of pyenv
   version-file   Detect the file that sets the current pyenv version
   version-name   Show the current Python version
   version-origin   Explain how the current Python version is set
   versions    List all Python versions available to pyenv
   virtualenv   Create a Python virtualenv using the pyenv-virtualenv plugin
   virtualenv-delete   Uninstall a specific Python virtualenv
   virtualenv-init   Configure the shell environment for pyenv-virtualenv
   virtualenv-prefix   Display real_prefix for a Python virtualenv version
   virtualenvs   List all Python virtualenvs found in `$PYENV_ROOT/versions/*'.
   whence      List all Python versions that contain the given executable
   which       Display the full path to an executable
See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme
``

在做後續的動作之前,建議先跑一下 pyenv doctor 讓 pyenv
自己檢查前面提到的用於編譯的套件是不是都有裝好。

### 安裝 Python 3.9

在裝 Python 3.9 之前,先看一下 pyenv 可以幫我們裝哪些個版本的
Python:

``
> pyenv install --listAvailable versions:
2.1.3
...
3.9.0
...
activepython-3.6.0
...
anaconda3-2020.07
...
graalpython-20.2.0
...
micropython-1.13
...
miniconda3-4.7.12
...
pypy3.6-7.3.1
...
pyston-0.6.1
...
stackless-3.7.5
``

可以看到不只是標準的 CPython,其他自行封裝的(ActivePython、Anaconda、miniconda)、
第三方的 Python 解釋器(PyPy、Pyston、Stackless、MicroPython)也都可以由 pyenv 安
裝與管理。

上面可以看到 Python 3.9 最新的版號就是 3.9.0,勇敢的把它裝起來:

``
> pyenv install 3.9.0
``

經過一連串嘰哩呱啦的下載與編譯過程,最後應該會看到一段成功的訊息。

我們可以用 pyenv versions 來確認一下當前系統內存在的 Python 有哪些:

``
> pyenv versions* system
  3.9.0
``

如預期的,除了系統預帶的 Python 外,多了一個 Python 3.9.0。

系統預帶的 Python前面有個 * 號,表示現在是用它當作目前操作環境下的 Python,
目前我們還不用做切換,直到在 Python 專案內才會在專案資料夾內定義專案的 Python
版本,而這需要下一個工具 Poetry。

### Python 專案的虛擬環境與套件管理

到上一節為止我們利用 pyenv 在系統內裝了 Python 3.9,下面會示範在一個新專案內利用
Poetry 這個工具來建立專案的 Python 虛擬環境以及管理依賴的套件。

關於 Python 的虛擬環境/套件管理工具,除了 Poetry 外,還有其他的選擇,可以參考
「Overview of python dependency management tools」一文了解它們之間的特性
與差異。前面我們用的 pyenv 其實也具有管理虛擬環境的能力,但個人比較偏好把虛擬環境
和套件管理器整合在一起的工具,pyenv本身不具被依賴套件管理的能力,而同時具備虛擬環
境管理與套件管理的工具,有 Poetry、Pipenv 等。

接下來開始裝 Poetry。

在安裝 Poetry前,因為 Poetry 本身也是以 Python 開發的,它也有它自己的依賴性問題,
所以我們想把它裝在 Python 3.9 的環境之下,因此我們先把 Python 切換到 3.9 的環境:

``
> pyenv global 3.9.0
``

雖然是要把 Poetry 裝在 Python 3.9 的環境內,但這並不影響後面 Poetry
建立虛擬環境時要用到的 Python 版本。

切換完可以用 pyenv versions 確認一下。

回到安裝 Poetry 的主題,Poetry 也有著傳便便的安裝腳本:

``
> curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
``

一樣一陣嘰哩呱啦的安裝完成後,預設會安裝在 ~/.poetry/ 內,首先要確保保
Poetry 的主程式 ~/.poetry/bin/poetry 有在 $PATH 內,有的話應該就可
以執行 poetry 了:

``
> poetryPoetry version 1.1.4USAGE
  poetry [-h] [-q] [-v [<...>]] [-V] [--ansi] [--no-ansi] [-n] <command> [<arg1>] ... [<argN>]ARGUMENTS
  <command>              The command to execute
  <arg>                  The arguments of the commandGLOBAL OPTIONS
  -h (--help)            Display this help message
  -q (--quiet)           Do not output any message
  -v (--verbose)         Increase the verbosity of messages: "-v" for normal output, "-vv" for more verbose output and "-vvv" for debug
  -V (--version)         Display this application version
  --ansi                 Force ANSI output
  --no-ansi              Disable ANSI output
  -n (--no-interaction)  Do not ask any interactive questionAVAILABLE COMMANDS
  about                  Shows information about Poetry.
  add                    Adds a new dependency to pyproject.toml.
  build                  Builds a package, as a tarball and a wheel by default.
  cache                  Interact with Poetry's cache
  check                  Checks the validity of the pyproject.toml file.
  config                 Manages configuration settings.
  debug                  Debug various elements of Poetry.
  env                    Interact with Poetry's project environments.
  export                 Exports the lock file to alternative formats.
  help                   Display the manual of a command
  init                   Creates a basic pyproject.toml file in the current directory.
  install                Installs the project dependencies.
  lock                   Locks the project dependencies.
  new                    Creates a new Python project at <path>.
  publish                Publishes a package to a remote repository.
  remove                 Removes a package from the project dependencies.
  run                    Runs a command in the appropriate environment.
  search                 Searches for packages on remote repositories.
  self                   Interact with Poetry directly.
  shell                  Spawns a shell within the virtual environment.
  show                   Shows information about packages.
  update                 Update the dependencies as according to the pyproject.toml file.
  version                Shows the version of the project or bumps it when a valid bump rule is provided.
``

接下來我們開始拿一個專案 project1 在裡面建立專屬於它的 Python 3.9 虛擬環境。

首先要指定這個專案要用的 Python 版本:

``
> pyenv local 3.9.0
> ls -a.  ..  .python-version> cat .python-version
3.9.0> python --versionpython 3.9.0

``

上面第一個指令用於指定這個 project1 資料夾要用的 Python 版本,
它會幫我們建立一個 .python-version 檔案,裡面只要寫上版次,pyenv
就會依照裡面指定的版次套用於這個資料夾內,後面我們也驗證了確實是用了
Python 3.9。

接著建立專案的虛擬環境:

``
> poetry initPackage name [project1]:
...
Compatible Python versions [^3.9]:
...Generated file[tool.poetry]
...[tool.poetry.dependencies]
python = "^3.8"[tool.poetry.dev-dependencies]
...[build-system]
...Do you confirm generation? (yes/no) [yes]
``

poetry init 命令用於初始化這個 project1 專案,透過問答式的界面,
最後會建立出 pyproject.toml 檔案,裡面有專案的基本資料、相容的
Python 版本、依賴的套件清單等等。

在建立完 pyproject.toml 後,實際上也定義出了一個以 Python 3.9
為基礎的虛擬環境,進去看看:

``
> poetry shellCreating virtualenv ...
Spawning shell within ...
...(project1-...) > python --versionPython 3.9.0(project1-...) > pip listPackage    Version
---------- -------
pip        20.2.2
setuptools 49.6.0
wheel      0.35.1
...
``

經過短暫的嘰哩呱啦後我們進入了 project1 虛擬環境的 shell 內,
也驗證了 Python 的版本及套件清單,相當的乾淨,至此我們得到了一個
以 Python 3.9 為基礎的乾淨的開發環境,並且它也獨立於其它的開發環
境。

## 結語

這篇文章介紹了 Python 的多版本管理以及專案虛擬環境從無到有的建立,
主要是混合運用 pyenv 及 Poetry 兩個工具,要注意的是兩者都有虛擬環
境管理的能力,但我們偏好用 Poetry,它同時能管理虛擬環境及專案的套件
依賴性。這篇文章僅談到虛擬環境的建立為止,並未提及專案依賴套件的加入
與管理,這部份會另外開一個主題來談。

--
※ 作者: INFOLINK 時間: 2021-01-15 16:28:58 (台灣)
※ 看板: Programming 文章推薦值: 0 目前人氣: 0 累積人氣: 305 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇