為什麼你的 Mac 跑 Python 會爆掉?新手最該學的不是語法,是環境管理
先講結論:你的 Mac 沒有你想的那麼堅強
剛拿到 Mac,裝了 VS Code,Google 搜了一下「Python 教學」,照著打了 pip install pandas。
然後事情開始不對勁。
終端機跳出一堆紅字,什麼 permission denied、什麼 externally-managed-environment。你心想:「我不是才剛開始嗎,怎麼就壞了?」
別慌,你沒有搞壞電腦。但你踩到了一個幾乎所有新手都會踩的坑:沒有先建立獨立的 Python 環境。
macOS 本身其實沒有預裝完整的 Python。當你在終端機輸入 python3,系統會提示你安裝 Xcode Command Line Tools,裝完後才會多一個 Python 3.9.x。但這個版本是綁定系統工具用的,直接拿來 pip install 裝套件,就會觸發 externally-managed-environment 錯誤。這是 Python 社群刻意設下的保護機制(PEP 668),目的是防止你把系統搞亂。
所以不管你是要學 Python、JavaScript、還是讓 AI 幫你寫 code,第一件該做的事不是學語法。
是「把環境管好」。
這篇文章會帶你從零開始,在 macOS 上建立一個乾淨的開發環境。所有步驟都是「打開終端機,複製貼上」就能完成,不需要任何程式基礎。
第一步:裝地基 — Xcode CLI + Homebrew
Xcode Command Line Tools
這東西不是 Xcode 那個肥大的 App,它是一包輕量的編譯工具。你之後裝的所有東西,底層幾乎都需要它。
打開終端機(Terminal),貼上這行:
xcode-select --install
跳出視窗後點「安裝」,等它跑完就好。
Homebrew:macOS 的套件總管
Linux 有 apt,macOS 有 Homebrew。它讓你用一行指令就能裝好各種開發工具。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
裝完之後,畫面下方會出現「Next steps」,裡面有兩行指令。這兩行一定要複製並執行,不然 brew 指令不會生效。通常長這樣(請以你螢幕顯示的為準):
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/你的使用者名稱/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
很多新手卡在這裡,裝完 Homebrew 卻用不了,十之八九就是漏了這步。
Git + GitHub CLI
開發離不開 Git。一起裝好 GitHub 的命令列工具,以後 push code 不用再到網頁上操作。
brew install git gh
登入 GitHub:
gh auth login
選 GitHub.com → HTTPS → Yes → Login with a web browser,照著畫面走就好。
第二步:Docker 不是只有 Docker Desktop
如果你之後會碰到資料庫、後端服務、或是任何需要跑 container 的東西,你會需要 Docker。
但請不要裝 Docker Desktop。
Docker Desktop 在 Mac 上很肥、很慢、很吃記憶體。它背後跑的是一個完整的 Linux 虛擬機,光是開著什麼都不做,RAM 就先被吃掉好幾 GB。
替代方案是 OrbStack。它是專門為 Apple Silicon 設計的 Docker 替代品,啟動大概 2 秒,記憶體佔用比 Docker Desktop 低約 60%,而且所有 docker 指令都完全相容。個人非商業用途免費,在 Mac 開發圈的討論度很高。
brew install --cask orbstack
裝好後到「應用程式」打開 OrbStack,點幾下完成初始化。它會自動幫你把 docker 指令設定好,之後用起來跟 Docker Desktop 沒有差別(除了快很多)。
補充:Apple 在 WWDC 2025 也發表了原生的 container 工具,用 Swift 寫的,但目前還在非常早期的階段(v0.1.0),缺少 docker-compose 等功能。如果你想要一個現在就能用的方案,OrbStack 是比較成熟的選擇。
第三步:Python 環境的正確打開方式 — uv
回到那個問題:為什麼你的 Mac 跑 Python 會爆掉?
因為你直接用了系統的 Python,而且用 pip 把套件裝到了系統層級。這就像是把你的私人物品全部堆在公共走廊,遲早會出事。
正確做法是用版本管理工具,幫你在系統之外建立一個獨立、乾淨的 Python 環境。
目前社群推薦的工具是 uv。
uv 是 Astral 公司用 Rust 寫的 Python 套件管理工具,根據官方 benchmark,安裝速度是 pip 的 10 到 100 倍(例如安裝 JupyterLab,uv 只要 2.6 秒,pip 需要 21 秒)。它能同時管理 Python 版本和虛擬環境,一套搞定,不用再搞什麼 pyenv + virtualenv + pip 的三件套。
安裝 uv(用官方腳本,不要用 brew 裝):
curl -LsSf https://astral.sh/uv/install.sh | sh
設定環境變數,讓終端機找得到它:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
下載一個乾淨的 Python(不會動到系統的):
uv python install 3.12
以後要開新專案,流程是這樣:
mkdir my-project && cd my-project
uv init # 初始化專案
uv add pandas # 裝套件(取代 pip install)
uv run main.py # 跑程式
從現在開始,你的腦內要建立一個自動轉換機制:
看到 pip install X → 自動翻譯成 uv add X。
這就是保持系統乾淨的秘訣。
第四步:Node.js 也不能直接裝 — nvm
如果你之後會碰前端、或是用任何 JavaScript/TypeScript 的工具(例如 Astro、Next.js),你會需要 Node.js。
Node.js 的版本更新非常快,而且不同專案可能需要不同版本。直接裝在系統上,之後版本一衝突,又是一場災難。
解法是 nvm(Node Version Manager),讓你用指令切換 Node 版本。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
版本號可能會更新,最新版本請查閱 nvm GitHub。
裝完後,把設定寫進 shell config:
echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.zshrc
source ~/.zshrc
安裝目前的 LTS(Long Term Support,長期支援版):
nvm install --lts
nvm use --lts
裝完輸入 node -v,有看到版本號就對了。
進階選項:如果你在意終端機啟動速度,可以考慮 fnm(Fast Node Manager)。它用 Rust 寫的,啟動速度比 nvm 快很多,指令也很類似。不過 nvm 的生態系比較成熟,新手用 nvm 完全沒問題。
第五步:給 AI CLI 工具立規矩
這一步是整篇文章最容易被忽略,但可能是最重要的。
現在的開發流程,很多時候是你下指令,AI Agent 幫你寫 code、跑指令、甚至幫你建專案。不管你用的是 Claude Code、Codex CLI、還是 Cursor,這些工具本質上都是「一個會打終端機指令的 AI」。
問題來了:如果你沒告訴它你的環境長什麼樣,它就會用它「以為」的方式來操作。
比如它可能會跑 pip install(錯),可能會試圖修改 /usr/bin(更錯),可能會用 apt-get(你又不是 Linux)。
所以你需要一份「家規」,在 AI 開始工作之前先讓它讀過。
如果你用 Claude Code,把以下內容放在專案根目錄的 CLAUDE.md:
# Development Environment
## Package Management
- Python: Use `uv` for everything.
- Create project: `uv init`
- Install packages: `uv add <package>` (NEVER use pip)
- Run scripts: `uv run script.py`
- Node.js: Managed via `nvm`. Use `npm` for packages.
- Do not use `sudo npm`.
- Check `.nvmrc` before running commands.
- System tools: Use `brew` only when explicitly asked.
- DO NOT use `apt-get`, `yum`, or `choco`.
## Containerization
- Using OrbStack (Docker compatible).
- Use standard `docker` and `docker compose` commands.
## File System
- macOS root is read-only. Do not modify `/usr/bin` or system paths.
- Projects are in `~/Projects/`.
## Git
- Use `gh` CLI for GitHub operations.
如果你用 Cursor,同樣的內容放在 .cursorrules 檔案裡。
如果你用 Codex CLI 或其他工具,找到它的 system prompt 或 instructions 設定,把上面那段貼進去。
格式不重要,重點是讓 AI 在動手之前知道三件事:
- Python 用
uv,不是pip - 不要碰系統目錄
- Docker 用 OrbStack,不用特別設定 VM
這份家規能幫你省下大量的 debug 時間。
最後:驗證一切是否就緒
打開終端機,跑這三行:
uv --version
nvm --version
docker --version
三個都有跑出版本號,就代表你的環境搞定了。
整理一下你現在裝了什麼:
| 工具 | 用途 | 安裝方式 |
|---|---|---|
| Xcode CLI | 編譯工具基礎 | xcode-select --install |
| Homebrew | macOS 套件管理 | 官方腳本 |
| Git + gh | 版本控制 + GitHub | brew install |
| OrbStack | Docker 替代品 | brew install --cask |
| uv | Python 版本 + 套件管理 | 官方腳本 |
| nvm | Node.js 版本管理 | 官方腳本 |
沒有多餘的東西,每個工具都有明確的職責,彼此不打架。
這套設定不花俏,但它能讓你的 Mac 在跑了一整年的專案之後,依然保持乾淨。
開始寫 code 吧。