【uv 套件管理器教學】#02 虛擬環境與依賴管理實戰

測驗:uv 虛擬環境與依賴管理實戰

共 5 題,點選答案後會立即顯示結果

1. 執行 uv venv 指令後,預設會在哪裡建立虛擬環境?

  • A. 在使用者家目錄的 ~/.venv 資料夾
  • B. 在當前目錄的 .venv 資料夾
  • C. 在系統的 Python 安裝目錄內
  • D. 在 /tmp/venv 暫存目錄

2. 如果想讓虛擬環境使用 Python 3.11,應該執行什麼指令?

  • A. uv venv python3.11
  • B. uv venv -v 3.11
  • C. uv venv --python 3.11
  • D. uv venv --version=3.11

3. uv pip sync requirements.txtuv pip install -r requirements.txt 的主要差別是什麼?

  • A. sync 速度比較快,install 速度比較慢
  • B. sync 會移除多餘的套件,install 只會新增套件
  • C. sync 只能用於新環境,install 可用於任何環境
  • D. sync 和 install 功能完全相同,只是名稱不同

4. 使用 uv run python script.py 執行程式時,有什麼好處?

  • A. 程式執行速度會更快
  • B. 可以同時執行多個 Python 版本
  • C. 會自動安裝缺少的依賴套件
  • D. 會自動偵測並使用當前目錄的 .venv,不需要手動 activate

5. 在團隊協作的專案中,應該使用 uv pip freeze 還是 uv pip compile 來管理依賴?為什麼?

  • A. 用 freeze,因為它列出的套件更完整
  • B. 用 compile,因為它能精確鎖定所有子依賴的版本,確保每次安裝結果一致
  • C. 兩者效果完全相同,選哪個都可以
  • D. 用 freeze,因為 compile 只適合個人專案

上一篇我們認識了 uv 是什麼、如何安裝。這篇要進入實戰:用 uv 建立虛擬環境、安裝套件、管理依賴檔案。

為什麼需要虛擬環境?

當你用 AI 輔助開發多個專案時,常會遇到這種情況:

  • 專案 A 需要 requests==2.28.0
  • 專案 B 需要 requests==2.31.0

如果都裝在系統 Python,版本會互相衝突。虛擬環境讓每個專案有獨立的套件空間,互不干擾。


建立虛擬環境:uv venv

基本建立

在專案目錄執行:

uv venv

這會在當前目錄建立 .venv 資料夾,裡面是獨立的 Python 環境。

指定 Python 版本

uv venv --python 3.11
Code language: CSS (css)

這會建立使用 Python 3.11 的虛擬環境。如果系統沒有該版本,uv 會自動下載。

指定資料夾名稱

uv venv my_env

這會建立名為 my_env 的虛擬環境資料夾(預設是 .venv)。

啟用虛擬環境

建立後需要啟用才能使用:

Linux / macOS:

source .venv/bin/activate

Windows:

.venv\Scripts\activate
Code language: CSS (css)

啟用後,終端機提示會顯示 (.venv),表示你現在在虛擬環境中。

小技巧:uv run 自動使用虛擬環境

其實 uv 有個方便的功能:uv run 會自動偵測並使用當前目錄的 .venv

uv run python script.py
Code language: CSS (css)

這樣就不用每次手動 activate 了。


安裝套件:uv pip install

安裝單一套件

uv pip install requests

安裝指定版本

uv pip install requests==2.31.0

安裝多個套件

uv pip install requests flask pandas

從 requirements.txt 安裝

這是最常見的情境。當你 clone 一個專案,通常會看到 requirements.txt

uv pip install -r requirements.txt
Code language: CSS (css)

uv 會讀取檔案內容,一次安裝所有依賴。

升級套件

uv pip install --upgrade requests

移除套件

uv pip uninstall requests

匯出依賴:記錄你裝了什麼

uv pip freeze:匯出已安裝套件

uv pip freeze > requirements.txt
Code language: CSS (css)

這會把目前環境的所有套件(含版本)輸出到檔案。別人拿到這個檔案就能重建相同環境。

輸出範例:

certifi==2024.2.2
charset-normalizer==3.3.2
idna==3.6
requests==2.31.0
urllib3==2.2.0

uv pip compile:鎖定依賴版本

freeze 只是列出已安裝的套件。compile 更進階,它會:

  1. 讀取你的 requirements.in(只列主要依賴)
  2. 解析所有子依賴
  3. 輸出完整的版本鎖定檔
# 建立 requirements.in(你直接需要的套件)
echo "requests" > requirements.in
echo "flask" >> requirements.in

# 編譯成完整的 requirements.txt
uv pip compile requirements.in -o requirements.txt
Code language: CSS (css)

輸出的 requirements.txt 會包含所有子依賴及其精確版本,確保每次安裝結果一致。


同步依賴:uv pip sync

這是 uv 的殺手級功能。sync 會讓環境「完全符合」requirements.txt:

uv pip sync requirements.txt
Code language: CSS (css)

它會:

  • 安裝缺少的套件
  • 移除多餘的套件
  • 調整版本不符的套件

為什麼這很重要?

假設你的 requirements.txt 有 10 個套件,但你之前測試時多裝了 5 個。用 install -r 只會新增,不會移除多餘的。sync 會確保環境「乾淨」,只有需要的套件。


常用指令對照表:pip vs uv pip

功能 pip 指令 uv pip 指令
建立虛擬環境 python -m venv .venv uv venv
安裝套件 pip install requests uv pip install requests
從檔案安裝 pip install -r requirements.txt uv pip install -r requirements.txt
匯出依賴 pip freeze > requirements.txt uv pip freeze > requirements.txt
移除套件 pip uninstall requests uv pip uninstall requests
列出已安裝 pip list uv pip list
同步環境 (沒有對應功能) uv pip sync requirements.txt
編譯依賴 pip-compile(需裝 pip-tools) uv pip compile

重點:uv pip 的指令結構和 pip 幾乎相同,只是前面加上 uv。如果你熟悉 pip,遷移成本很低。


實戰範例:從零建立專案環境

假設你要開始一個新的 Flask 專案:

# 1. 建立專案目錄
mkdir my_flask_app
cd my_flask_app

# 2. 建立虛擬環境(使用 Python 3.11uv venv --python 3.11

# 3. 安裝依賴
uv pip install flask python-dotenv

# 4. 匯出依賴檔案
uv pip freeze > requirements.txt

# 5. 執行程式(自動使用 .venvuv run python app.py
Code language: CSS (css)

當同事要接手這個專案:

# 1. Clone 專案
git clone <repo_url>
cd my_flask_app

# 2. 建立虛擬環境
uv venv

# 3. 同步依賴(確保環境一致)
uv pip sync requirements.txt

# 4. 開始開發
uv run python app.py
Code language: PHP (php)

常見問題

Q: uv venv 和 python -m venv 有什麼差別?

功能相同,但 uv venv:

  • 速度更快
  • 可以自動下載指定的 Python 版本
  • 不需要先裝好該版本的 Python

Q: 什麼時候用 freeze,什麼時候用 compile?

  • freeze:快速記錄目前環境,適合個人專案
  • compile:精確鎖定版本,適合團隊協作或部署

Q: 一定要 activate 才能用虛擬環境嗎?

不一定。使用 uv run 可以自動使用 .venv,不需要 activate。


本篇重點回顧

  • uv venv:建立虛擬環境,可指定 Python 版本
  • uv pip install:安裝套件,語法和 pip 相同
  • uv pip freeze:匯出已安裝套件清單
  • uv pip compile:從 .in 檔編譯完整依賴
  • uv pip sync:同步環境,移除多餘套件
  • uv run:自動使用 .venv 執行指令

下一篇我們會介紹 uv 的專案管理功能:pyproject.tomluv.lock,讓依賴管理更現代化。

進階測驗:uv 虛擬環境與依賴管理實戰

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你剛加入一個新專案,從 GitHub clone 下來後要開始開發。專案有 requirements.txt 檔案。為了確保環境乾淨且與團隊一致,你應該執行什麼指令? 情境題

  • A. uv pip install -r requirements.txt
  • B. pip install -r requirements.txt
  • C. uv venv && uv pip sync requirements.txt
  • D. uv venv && uv pip freeze > requirements.txt

2. 你的專案需要同時支援兩個 Python 版本(3.10 和 3.11)進行測試。你想為 Python 3.10 建立一個名為 .venv-py310 的虛擬環境。正確的指令是什麼? 情境題

  • A. uv venv --python 3.10
  • B. uv venv .venv-py310 --python 3.10
  • C. uv venv -n .venv-py310 -v 3.10
  • D. python3.10 -m uv venv .venv-py310

3. 你的團隊要部署應用程式到正式環境。目前你只有 requirements.in(列出主要依賴如 flask、requests)。為了確保部署環境的套件版本完全可控,你應該如何處理? 情境題

  • A. 直接用 uv pip install -r requirements.in 部署
  • B. 用 uv pip freeze 匯出後部署
  • C. 手動編輯 requirements.in 加上版本號
  • D. 用 uv pip compile requirements.in -o requirements.txt,然後部署時用 uv pip sync requirements.txt

4. 小明執行以下指令,但 Flask 套件沒有被安裝成功。問題出在哪裡? 錯誤診斷

$ cd my_project $ uv venv $ uv pip install flask error: No virtual environment found; run `uv venv` to create one
  • A. Flask 套件名稱打錯了
  • B. uv venv 執行失敗,虛擬環境沒有建立
  • C. 建立虛擬環境後沒有啟用,而且沒用 uv run
  • D. 需要先執行 uv init 初始化專案

5. 小華的開發環境出現問題:她的專案只需要 5 個套件,但環境中卻有 20 多個套件(之前測試裝的)。她執行了以下指令,但多餘的套件仍然存在。問題出在哪裡? 錯誤診斷

$ uv pip install -r requirements.txt Audited 5 packages in 0.01s # 檢查後發現環境中仍有 20+ 個套件
  • A. requirements.txt 檔案內容有誤
  • B. 應該用 uv pip sync 而不是 uv pip install -r,sync 會移除多餘套件
  • C. 需要先執行 uv pip uninstall --all 清空環境
  • D. 需要刪除 .venv 資料夾並重新建立虛擬環境

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *