Skip to content
Chris Yuan | Blog
Go back

macOS Python 環境整理筆記

Edit page

Table of contents

Open Table of contents

背景

macOS 系統自帶 Python 3.9.6,但該版本已於 2025 年 10 月 31 日正式 EOL,不再收到任何安全更新。目前 Python 最新的 feature release 是 3.14.3(2026 年 2 月發布),3.15 正在開發中。

原本系統上透過 Homebrew 安裝了 Python 3.11 ~ 3.14 多個版本,以及大量 Python CLI 工具,需要整理乾淨。

為什麼選 uv

現在大家大致都改用 uv 了。uv 是做 Ruff linter 那家 Astral 的產品,用 Rust 寫的,速度很快。一個工具就能處理 Python 版本、虛擬環境、套件安裝、CLI 工具,pyenv、pipx、poetry 那些都不用了。

uv 下載預編譯 binary,裝 Python 只要幾秒,不像 pyenv 還得從原始碼編譯。

安裝 uv

# 透過 Homebrew
brew install uv

Shell Completion(zsh)

# 方式一:動態載入(每次開 shell 都跑一次,略慢)
echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc

# 方式二:靜態輸出(較快,但 uv 升級後需重新產生)
uv generate-shell-completion zsh > ~/.zfunc/_uv
# 確保 ~/.zfunc 在 fpath 裡,放在 compinit 之前:
# fpath=(~/.zfunc $fpath)
# autoload -Uz compinit && compinit

Python 版本管理

uv python install 3.14           # 安裝最新穩定版
uv python install 3.12 3.13 3.14 # 同時裝多個版本
uv python list                    # 查看所有可用/已安裝版本
uv python uninstall 3.10          # 移除不需要的版本

專案層級管理

cd ~/my-project
uv python pin 3.14    # 釘選版本,建立 .python-version
uv venv                # 建立 venv
uv add requests pandas  # 安裝依賴,自動寫入 pyproject.toml
uv run python main.py   # 不需要手動 activate
uv run pytest

CLI 工具管理

用 uv tool 取代 Homebrew 安裝的純 Python CLI 工具

uv tool install bpytop
uv tool install certbot
uv tool install glances
uv tool install hf               # huggingface
uv tool install httpie
uv tool install litecli
uv tool install llm              # Simon Willison 的 LLM CLI
uv tool install mercurial
uv tool install mycli
uv tool install pygments
uv tool install pylint
uv tool install restructuredtext-lint  # brew 裡叫 rst-lint
uv tool install yamllint
uv tool install yt-dlp

更新工具

uv tool upgrade --all    # 更新全部
uv tool upgrade yt-dlp   # 更新特定工具

pdm / poetry → 不再需要

uv 能做的事情已經完全涵蓋這兩個了,我直接 brew uninstall 移掉。真的碰到舊專案需要 poetry 的話,uvx poetry install 臨時跑一下就好,不用特別裝。

不過要注意,如果你有在用 poetry 的 plugin 生態(像 poetry-dynamic-versioning)或 pdm 的 PEP 582 模式,這些 uv 目前還沒覆蓋到,移除前先評估一下。

留在 Homebrew 的套件

有系統層依賴,uv 管不了

雲端 CLI 工具

整理 Homebrew Python 依賴的方法

# 查看哪些套件依賴特定 Python 版本
brew uses --installed python@3.13
brew uses --installed python@3.14

# 區分「主動安裝」vs「被依賴拉進來」
brew leaves | grep python

# 移除後清理不再需要的依賴
brew autoremove

讓 python3 指向 uv 管理的版本

確認 ~/.local/bin 在 PATH 中排在 /opt/homebrew/bin 前面(已確認),然後建立 symlink:

ln -sf ~/.local/share/uv/python/cpython-3.14-macos-aarch64-none/bin/python3.14 ~/.local/bin/python3

注意這個路徑包含版本號,之後升級到 3.15 時 symlink 不會自動跟著更新,要記得手動重建。

最終狀態

來源版本用途
系統3.9.6macOS 內部用,不動
Homebrew3.13awscli / azure-cli / gcloud-cli 的 dependency
Homebrew3.14llvm / nmap / vim / ykman 的 dependency
uv3.14日常開發主力,python3 指向這裡

Homebrew 和 uv 各自有一份 3.14 是正常的,互不干擾。

日常維護

brew upgrade uv                        # 更新 uv(因為是用 brew 安裝的)
uv python install 3.xx                 # 新版 Python 出來時安裝
uv tool upgrade --all                  # 更新所有 CLI 工具
ln -sf ~/.local/share/uv/python/cpython-3.xx-macos-aarch64-none/bin/python3.xx ~/.local/bin/python3  # 升級後重建 symlink

踩過的坑

~/.cache/uv 權限問題

之前用 sudo uv 導致 cache 目錄下部分檔案 owner 變成 root,執行 uv cache clean 會 Permission denied。

解法:

# 最乾脆的方式:直接整個刪掉,uv 會自動重建
sudo rm -rf ~/.cache/uv

# 或者修正權限後再清
sudo chown -R $(whoami):staff ~/.cache/uv
uv cache clean

以後不要用 sudo uv,uv 設計上所有東西都在 user space,不需要 root。

uv cache clean 要在正確目錄執行

如果 cd ~/.cache/uv 後執行,uv 會把 current working directory 當成 cache 路徑,輸出會顯示 Clearing cache at: .,等於它在試圖清掉你當前目錄下的東西。切回 ~ 或任何其他目錄再執行就正常了。

uv cache 空間管理

du -sh ~/.cache/uv/*/  | sort -rh | head -10  # 查看哪個子目錄最肥
uv cache prune --dry-run                        # 預覽可回收空間
uv cache prune                                  # 只清不再被引用的 cache
uv cache clean                                  # 清除全部 cache

Edit page
Share this post on:Link copied!

Previous Post
一個月 $5 的 Managed PostgreSQL 到底怎麼做到的?從 PlanetScale 的定價策略看 DBaaS 的底層架構
Next Post
AWS ECR Create on Push:一個客戶敲碗敲了六年才有的基本功能