今天想來跟大家介紹,另一個在開發 Python 開源套件很重要的項目,那就是使用 虛擬環境 的套件管理,跟他如何在開源幫助到我們。
。
平常我們在開發 Python 程式的時候,如果 Python 內建的套件沒辦法滿足我們的需求,我們就會去尋求第三方套件,像是這次開發使用到的 requests、pandas 與 pytest 等。我們就會需要使用 pip 來安裝這些套件到我們的電腦裡。正常沒有使用虛擬環境的情況下,這些套件會透過 pip
安裝到存放 Python 的根目錄裡,可以使用指令 which python
去查看根目錄在哪。
如果只有一個專案的情況下可能還好,但當我們開發不同的專案,可能會需要不同功能的套件,像是我們這次就不會需要一些視覺化套件,或是用來做機械學習的套件。這樣的情況累積起來,套件的數量會變得很龐大,有些套件可能還會有相依性跟版本的問題,也許到另一個專案就不能用了。因此,就會需要使用虛擬環境來幫忙。
虛擬環境的使用有點像是在專案建立一個獨立的資料夾來儲存會使用的套件,可以建立複數個進行切換,他們彼此不會互相影響,就能降低套件彼此的相依問題,也可以彈性切換不同版本的套件使用,甚至是可以切換不同的 Python 版本。
可以實作 Python 虛擬環境的方式很多,像是 Python 內建的 venv、Conda、virtualenv,另外還有一個管理套件的工具,方法很像是 NPM 的 Pipenv。不過這次我會主要介紹內建的 venv
,另外要注意,如果是想使用 pyvenv
,他在 Python 3.8 已經被移除內建了。
要在專案裡使用 venv
新增一個虛擬環境其實滿簡單的,只要使用指令:
python -m venv .venv
這樣會在專案底下建立一個 .venv
的目錄,這之後使用 pip
安裝的套件就會儲存在裡面。執行完這個指令後要起用他就會使用指令:
# Windows
.venv\Scripts\activate
# Mac & Unix
source .venv/bin/activate
# 停用
deactivate
這樣就會把 Python 指向的路徑指到我們新建的 .venv
目錄裡,可以使用 which python
檢查,會發現路徑會變成在 .venv
裡:
最後記得把他加進 .gitignore
裡,不然每次上傳下載都要移動整包套件組,實在太龐大。
虛擬環境建立好後,除了讓我們套件輕量化了,還有一個方便的功能,就是能把安裝在虛擬環境上的套件,輸出成 requirements.txt
檔,裡面會記錄各個套件當前的版本,可以用這個指令輸出:
python -m pip freeze > requirements.txt
裡面會長這樣:
certifi==2024.8.30
charset-normalizer==3.3.2
idna==3.10
iniconfig==2.0.0
numpy==2.1.2
packaging==24.1
pandas==2.2.3
pluggy==1.5.0
pytest==8.3.3
python-dateutil==2.9.0.post0
pytz==2024.2
requests==2.32.3
six==1.16.0
tzdata==2024.2
urllib3==2.2.3
這個檔案可以讓我們為這些套件做版本控制,可以去改裡面的版號後重新安裝。另一個是,當別人 clone
我們的 Repo 的時候,他們可以不用一個一個套件 pip install
,而是可以使用指令:
python -m pip install -r requirements.txt
直接透過 requirements.txt
安裝套件,版號也會大家都一樣,就不會有套件版本不同產生 Bug 但無法重現的問題。也是這個原因,我們也可以套用在 Github Actions 裡,讓我們的檢查可以執行 pytest
:
test:
name: Run tests 🧪
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: python3 -m pytest tests/
這在開源十分重要,之後我們用昨天介紹的 Markdown
在寫如何貢獻開源的時候,就可以寫如何安裝我們需要的套件,讓其他人也可以在同樣的 Python 環境下開發。
直到最近在寫測試的 Github Actions 的時候才想起來還沒介紹虛擬環境,通常我都是直接 pip install
,直到我產生 requirements.txt
後才發現原來我電腦裡已經有那麼多套件了。除了 venv
以外其實我也滿推薦用用看 pipenv
的,因為我自己主要工作是前端工程師,已經滿習慣 Npm
跟 Node
那一套套件管理模式了,大家也可以選擇自己喜歡的虛擬環境試試看。
最後一樣感謝大家耐心地看完今天的文章,有任何問題與建議歡迎留言告訴我,明天見,掰掰。