目錄
    Add a header to begin generating the table of contents

    把 Python 專案升級至 Python 3.10?VS Code 的示範

    把 Python 專案升級至 Python 3.10?VS Code 的示範
    Share on facebook
    Share on twitter
    Share on linkedin
    Share on whatsapp
    目錄
      Add a header to begin generating the table of contents

      最近我有一個運行 Python 3.7 的專案(project),在增加功能的時候,發現有些新的 pandas 功能用不了。細看之下,才發現原來我的 Python 環境(3.7.10)未能支援最新的 pandas 版本。

      今天我們來探討為何我們需要把 Python 專案的 Python 版本升級,以及如何有序地進行這個動作吧!

      為何需要更新 Python?

      在程式設計裡,很重要的一環是確保我們的專案不會因為專案所需的軟件版本改變而失效,亦即是所謂的變革管理(change management)。

      試想像我們有一台 iPhone 4。假如我們今天需要更換電池,我們不會把 iPhone 12 的電池直接更換至這台 iPhone 4,因為 iPhone 4 的設計並不兼容 iPhone 12 的電池。軟體管理上亦是如此。

      既然是這樣,我們為什麼還要升級 Python 的版本?如果我們不更新 Python 的版本,豈不是甚麼問題都沒有?

      我是廣告 ^o^

      以下我們有幾個考量點:

      Library 的兼容性

      Python 其中一個最大的吸引力,在於有很多已經非常成熟的 Library 可以使用。而隨著 Python 的更新,許多 Library 亦會逐漸淘汰對舊 Python 版本的支援。

      比方說,pandas 這個非常重要的數據處理 library 在 2019 年已經放棄對 Python 2.7 的更新。而我在使用的 Python 3.7.10 亦不能更新到 pandas 1.3.5 以後的版本。

      新的 library 版本加入新功能以後,網上的資源如說明書(documentation)、討論區(stackoverflow 等)亦會推薦使用新版本的功能和語法。

      所以,如果您想繼續從網上輕易找到編程資源,便非常需要更新 Python 版本,以使用最新版本的 library。

      我是廣告 ^o^

      Python 語法的變異

      除此之外,另外一個十分重要的原因是新的 Python 版本往往會加入新的語法。

      當然,新的語法未必等於您會立刻加入到您專案的語法,但這些語法可能會讓您節省大量時間。

      舉一個極端的例子,在 Python 2.0 版本以前,是沒有 list comprehension 的。當初推出 list comprehension 時,未必立刻普及。但時至今日,list comprehension 成為了 Python 標誌性的語法。

      Python 3.10 帶來了幾個新的語法。其中一個讓我頗感興趣的,是所謂的 Structural Pattern Matching 語法

      如果您曾學過其他編程語言,您或會發現 Python 缺少了所謂的 case-when 語法:

      我是廣告 ^o^
      # Python 3.10 引入的 case-when 語法
      match subject:
          case <pattern_1>:
              <action_1>
          case <pattern_2>:
              <action_2>
          case <pattern_3>:
              <action_3>
          case _:
              <action_wildcard>

      Python 3.10 加入了這個在其他編程語言普遍都有的語法。這讓我十分期待 case-when 是否會在 Python 3.10 後發揚光大!

      變革管理(change management)

      最後我們回到變革管理。基於以上的原因,我們有確切的需求把 Python 版本更新。

      既然如此,從一個變革管理的角度,我們應該積極地定時把 Python 版本更新到最新的版本。

      假設我們有一個 Python 2.7 的專案。如果我們只是在 Python 3.10 出爐後才更新,那我們可以想像我們所需要更改的編程量會非常多。

      但如果我們先把 Python 2.7 更新至 Python 3.5,以後再至 Python 3.7、3.10 等,以階段的方法更新,我們每一次需要更改的量便變得比較可行(manageable)了。

      我是廣告 ^o^

      如何有序地更新 Python 版本?

      我們知道更新 Python 版本的理由後,我們便可以開始著手更新 Python 版本了。以下的步驟未必是最快的步驟,但將會是一個把編程出錯的機會降到非常低的方法。

      第 1 步:備份專案

      做任何事之前,當然最好先做備份吧!

      除了最簡單的複製整個專案之外,如果我們有使用 Git 等的版本控制工具,也可以先 Commit 改變。

      此外,另外一個很重要的備份是把我們的虛擬環境安裝的 Library 版本備份。這是因為我們萬一把更新搞砸了,可以很快地還原(rollback)至現在的 Python 環境。

      如果您不知道什麼是虛擬環境,可以參考這篇教學:VSCode 2/5: 設定虛擬環境 Virtual Env,管理 Python 專案!

      我是廣告 ^o^

      在 VS Code Terminal 使用以下的指令,可以儲存成一個名叫「requirements.txt」的檔案。記得確認自己是否已經使用專案的虛擬環境(就像下圖的 (.venv-p10) 字句)。

      pip freeze > requirements.txt

      第 2 步:安裝新的 Python 版本

      首先我們需要安裝所需的新 Python 版本。為了我們可以同時使用多個的 Python 版本,我們可以使用 pyenv 軟體安裝所需的 Python 版本。詳細可以參考這篇教學:macOS 安裝多個 Python 版本?pyenv 配合 VS Code 教學

      這裡我們假設您已透過 pyenv 安裝了 Python 3.10.2 版本。

      第 3 步:製造新的 Python 3.10 虛擬環境

      接下來,我們使用 pyenv 安裝的 Python 3.10 ,為我們的專案製造新的虛擬環境。

      首先我們在 VS Code Terminal 運行以下指令安裝 virtualenv

      我是廣告 ^o^
      pyenv local 3.10.2
      pyenv exec pip3 install virtualenv
      pyenv exec virtualenv .venv-3-10-2

      以上的指令告訴 pyenv 安裝的 Python 3.8.9 去安裝 virtualenv,並建立一個新的虛擬環境。您會立刻在 VS Code 的右下方見到這個彈出。按一下「Yes」。

      當您把 VS Code 的 Terminal 關閉並重啟(Command + Shift + P,然後選擇「Python: Create Terminal」)後,便會見到如下圖的(.venv-3-10-2)在您的指令前。

      恭喜您!我們已經創建新的虛擬環境,在運行 Python 3.10.2。

      第 4 步:安裝專案的 Library

      既然我們安裝了新的虛擬環境,自然要在這個環境安裝我們所需的 Library。

      我們可以使用 pip 重新安裝我們的 Library。還記得我們一開始使用的 pip freeze > requirements.txt 嗎?

      我是廣告 ^o^

      我們可以用一個簡單的 pip 指令安裝所有的 Library。如果您不太清楚 pip 的用法可以參考這裡:VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!

      pip install -r requirements.txt

      完成後,如果我們再次運行 python main.py (或其他您的專案的 Python 檔案),可以測試一切是否運作正常。

      由於我們這次是由 Python 3.7 升級至 Python 3.10,而我們本來的專案支援 3.7,所以絕大部分的 Library 都應該運作正常。

      但有時一些 Python 的升級會使某些 Library 的代碼失效,那麼我們便需要 debug 逐個去排除哪一個 Library 出錯了。

      第 5 步:更新 Library

      最後,我們在安裝了新的 Python 版本後,可以更新我們的 Library,以使用最新的 Library 語法和功能。

      我是廣告 ^o^

      如果我們已知哪個 Library 需要更新(例如 pandas),可以在 VS Code Terminal 使用以下指令:

      pip install --upgrade pandas

      但如果我們比較進取,想一次過更新所有的 Library,可以用以下的語法(詳細可以參考這篇教學):

      pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

      如果我們更新了 Library,出現問題,我們可以參考這篇教學,在 VS Code Terminal 重新使用 requirements.txt 裡的 Library 版本:

      rm -rf .venv-3-10-2
      pyenv local 3.10.2
      pyenv exec virtualenv .venv-3-10-2

      重新啟動 VS Code Terminal 後,再輸入以下指令:

      pip install -r requirements.txt

      第 6 步:把已更新的 Library 版本記錄在案

      把我們的 Library 更新以後,我們可以把新的 Library 版本記錄在 requirements.txt 裡:

      我是廣告 ^o^
      pip freeze > requirements.txt

      完成後,我們的 requirements.txt 便會反映 Python 3.10.2 的 Library 列表。我們下次需要恢復這個專案時,便可以使用這個新的 requirements.txt 安裝所需的插件。

      第 7 步:我後悔了,怎樣回到原來的 Python 版本?

      有時我們更新了 Python 版本之後,才發現原來許多的 Library 未支援這個新的 Python 版本。

      這時,由於我們在以上的步驟裡建立了新的虛擬環境,未有刪除舊的虛擬環境,我們便可以非常簡單地使用 VS Code 的功能,還原到原來的虛擬環境。

      在 VS Code 按 Command + Shift + P 後選擇「Python: Select Interpreter」,便可以回到過去了~

      舊的虛擬環境使用了舊的 Python 版本,便不用擔心兼容的問題。

      我是廣告 ^o^

      之後,我們可以重新安裝一個不是最新的 Python 版本,再測試是否兼容我們所需的 Library。

      譬如我們從 Python 3.7 升級到 3.10 失敗後,可以試試用同樣的步驟安裝 Python 3.8,試試專案是否能在 3.8 運行。

      結語

      希望透過今天的教學,您可以了解到如何有序地更新自己的專案到最新的 Python 版本吧!

      人氣文章

      快讓我學更多

      small_c_popup.png
      想學習 Python 嗎?
      快來訂閱我們的電子報!