我的macOS,装机的时候,直接从旧MacBook导入的全量信息及配置,目前使用homebrew遇到了问题,发现opt和usr下,分别都有一个homebrew,另外,我在opt下还发现了anaconda3,我主要是用python进行AI coding,目前经常因为版本遇到问题,包含pip、brew、python,然后就通过GPT帮忙出了一个解决方案,使各相关组件的版本统一,故记录如下。
Homebrew→pyenv→venv→项目关系图
graph TD
A[macOS ARM64 (M系列)] --> B[/opt/homebrew]
B -->|安装依赖: openssl, readline, zlib, ...| C[pyenv]
C -->|管理多个版本| D1[Python 3.12.6]
C --> D2[Python 3.10.14]
C --> D3[其他 Python 版本]
D1 -->|shims 统一入口| E[~/.pyenv/shims]
D2 --> E
D3 --> E
E -->|python / pip / python3 / pip3| F[Shell (bash / zsh)]
F -->|执行 python/pip 时自动映射| E
subgraph Project
G[项目目录] --> H[.venv]
H -->|隔离依赖| I[pip install numpy, pandas, torch...]
end
E -->|python -m venv .venv| H
解读
Homebrew (/opt/homebrew)
- 管理系统级依赖(编译 Python 需要的 openssl/zlib 等)
- 只保留 ARM64 版,删除 Intel 版
pyenv (~/.pyenv)
- 统一管理多版本 Python
- ~/.pyenv/shims 作为唯一入口,确保 python/pip 调用一致
venv (每项目 .venv)
- 在项目目录下隔离依赖,避免全局污染
- mkvenv 快捷创建,workon 快捷激活
shell (bash / zsh)
- 都加载 .bash_profile / .zprofile,保证 PATH 前缀正确
- 输入 python 时,实际走 ~/.pyenv/shims/python → 指向当前 pyenv 版本
检查
我原有的mac,默认安装的python2,现在基本都升级到python3了,由于python3升级幅度比较大,与python2的很多语法都不兼容,所以经常会遇到,当python版本不一致的时候,同样的脚本,有的可以执行,有的不行,给很多新手造成困扰。
我的做法是,先手动检查,再用自动检查脚本确认,看下具体的问题,然后再进行修复。
手动检查
可以在终端输入以下命令,来查看本地相关的环境是否统一:
# 列出关键信息
uname -m
which -a brew
which -a python python3 pip pip3
echo $PATH
期望结果:
- brew:只出现 /opt/homebrew/bin/brew
- python / pip / python3 / pip3:均来自 ~/.pyenv/shims/…
- PATH 中不含 anaconda3、不含 /usr/local/Homebrew
- uname -m 为 arm64
自动检查
可以通过以下脚本,完成自动检查:
- 分7个章节打印环境现状(brew、pyenv、python/pip 入口、架构、venv、PATH、建议)
- 任何异常会以 [WARN]/[ERR] 标出,对应下方"快速修复建议"的命令即可处理
# 1) 保存脚本
cat > ~/diag_env.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
# ===== util =====
C_RESET=$'\033[0m'
C_GREEN=$'\033[32m'
C_YELLOW=$'\033[33m'
C_RED=$'\033[31m'
C_BLUE=$'\033[34m'
ok(){ echo "${C_GREEN}[OK]${C_RESET} $*"; }
warn(){ echo "${C_YELLOW}[WARN]${C_RESET} $*"; }
err(){ echo "${C_RED}[ERR]${C_RESET} $*"; }
info(){ echo "${C_BLUE}[INFO]${C_RESET} $*"; }
section(){
echo
echo "===================================================="
echo " $*"
echo "===================================================="
}
print_kv(){ printf "%-28s %s\n" "$1" "$2"; }
# ===== 0. basics =====
section "0) 基线信息"
ARCH="$(uname -m || true)"
SHELL_BIN="${SHELL:-unknown}"
print_kv "uname -m" "$ARCH"
print_kv "SHELL" "$SHELL_BIN"
print_kv "whoami@host" "$(whoami)@$(hostname))"
# PATH 前10位
echo "PATH (前10项):"
echo "$PATH" | tr ':' '\n' | nl | sed -n '1,10p'
# ===== 1. brew =====
section "1) Homebrew 检查"
/usr/bin/which brew >/dev/null 2>&1 && BREW_PATH="$(/usr/bin/which -a brew | paste -sd ' , ' -)" || BREW_PATH=""
if [[ -z "$BREW_PATH" ]]; then
err "未检测到 brew"
else
print_kv "which -a brew" "$BREW_PATH"
BREW_ONE="$(/usr/bin/which brew || true)"
print_kv "brew --version" "$(brew --version 2>/dev/null | head -n1 || echo NA)"
if [[ "$BREW_ONE" == "/opt/homebrew/bin/brew" ]]; then
ok "brew 指向 /opt/homebrew(ARM)"
else
warn "brew 非 /opt/homebrew/bin/brew:$BREW_ONE"
fi
# 检查是否存在 Intel 残留
if echo "$BREW_PATH" | grep -q "/usr/local/bin/brew"; then
warn "检测到 Intel Homebrew 残留:/usr/local/bin/brew"
echo " 建议清理:
/usr/local/bin/brew --version 2>/dev/null && \\
/bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)\" || true
sudo rm -rf /usr/local/Homebrew /usr/local/Caskroom /usr/local/Cellar
find /usr/local/bin -type l -lname '../Homebrew/*' -delete 2>/dev/null || true"
fi
fi
# ===== 2. pyenv =====
section "2) pyenv 检查"
if command -v pyenv >/dev/null 2>&1; then
print_kv "pyenv --version" "$(pyenv --version 2>/dev/null || echo NA)"
print_kv "pyenv root" "$(pyenv root 2>/dev/null || echo NA)"
print_kv "pyenv global" "$(pyenv global 2>/dev/null || echo NA)"
print_kv "pyenv which python" "$(pyenv which python 2>/dev/null || echo NA)"
print_kv "pyenv versions" "$(pyenv versions --bare 2>/dev/null | tr '\n' ' ' || echo NA)"
else
err "未检测到 pyenv(建议:brew install pyenv)"
fi
# ===== 3. python/pip 入口一致性 =====
section "3) python/pip 入口一致性"
type -a python 2>/dev/null || true
type -a pip 2>/dev/null || true
type -a python3 2>/dev/null || true
type -a pip3 2>/dev/null || true
PY_PATH="$(command -v python 2>/dev/null || true)"
PIP_PATH="$(command -v pip 2>/dev/null || true)"
PY3_PATH="$(command -v python3 2>/dev/null || true)"
PIP3_PATH="$(command -v pip3 2>/dev/null || true)"
print_kv "python -V" "$(python -V 2>/dev/null || echo NA)"
print_kv "pip -V" "$(pip -V 2>/dev/null || echo NA)"
print_kv "python path" "$PY_PATH"
print_kv "pip path" "$PIP_PATH"
print_kv "python3 path" "$PY3_PATH"
print_kv "pip3 path" "$PIP3_PATH"
check_shims(){
local p="$1" n="$2"
if [[ -z "$p" ]]; then
warn "$n 未找到"
return
fi
if [[ "$p" == "$HOME/.pyenv/shims/"* ]]; then
ok "$n 来源:pyenv shims"
else
warn "$n 非 pyenv shims(当前:$p)"
fi
}
check_shims "$PY_PATH" "python"
check_shims "$PIP_PATH" "pip"
check_shims "$PY3_PATH" "python3"
check_shims "$PIP3_PATH" "pip3"
# ===== 4. 架构一致性 =====
section "4) 架构一致性"
if [[ -n "$PY_PATH" ]]; then
print_kv "file $(which python)" "$(file "$(which python)" 2>/dev/null || echo NA)"
fi
if [[ "$ARCH" != "arm64" ]]; then
warn "当前 shell 不是 arm64(可能在 Rosetta 下)。建议使用原生 ARM 终端。"
else
ok "终端架构:arm64"
fi
# ===== 5. venv 现场检查(如果有) =====
section "5) venv 检查(当前目录)"
if [[ -d ".venv" ]]; then
VENV_PY="./.venv/bin/python"
if [[ -x "$VENV_PY" ]]; then
print_kv ".venv python -V" "$("$VENV_PY" -V 2>/dev/null || echo NA)"
print_kv ".venv site" "$("$VENV_PY" -c 'import sys;print(sys.prefix)' 2>/dev/null || echo NA)"
ok "检测到本地 .venv:$(realpath ./.venv 2>/dev/null || echo ./.venv)"
else
warn "存在 .venv 目录,但缺少可执行 python(可能未正确创建)"
fi
else
info "当前目录未发现 .venv(正常;按项目需要创建)"
fi
# ===== 6. PATH 健康度 =====
section "6) PATH 健康检查"
HAS_SHIMS="$(echo "$PATH" | tr ':' '\n' | grep -c "^$HOME/.pyenv/shims$" || true)"
HAS_BREW="$(echo "$PATH" | tr ':' '\n' | grep -c "^/opt/homebrew/bin$" || true)"
if [[ "$HAS_SHIMS" -eq 0 ]]; then
warn "PATH 中缺少 ~/.pyenv/shims"
fi
if [[ "$HAS_BREW" -eq 0 ]]; then
warn "PATH 中缺少 /opt/homebrew/bin"
fi
echo "PATH 去重建议(可选,手动加入到 .bash_profile 或 .zprofile 末尾):"
echo ' export PATH="$(awk -v RS=: '\''!a[$0]++{s=s? s RS $0 : $0} END{print s}'\'' <<<"$PATH")"'
# ===== 7. 快速修复建议 =====
section "7) 快速修复建议"
cat <<'TIP'
A. 统一入口(写入 ~/.bash_profile 或 ~/.zprofile):
# Homebrew
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
eval "$(/opt/homebrew/bin/brew shellenv)"
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"
B. 清理 Intel Homebrew(如检测到 /usr/local/bin/brew):
/usr/local/bin/brew --version 2>/dev/null && \
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)" || true
sudo rm -rf /usr/local/Homebrew /usr/local/Caskroom /usr/local/Cellar
find /usr/local/bin -type l -lname '../Homebrew/*' -delete 2>/dev/null || true
C. 安装/修复 pyenv Python:
brew install openssl readline zlib bzip2 xz
export PYTHON_CONFIGURE_OPTS="--enable-shared"
pyenv install -s 3.12.6
pyenv global 3.12.6
pyenv rehash
D. 每项目 venv:
python -m venv .venv
source .venv/bin/activate
pip install -U pip setuptools wheel
TIP
ok "体检完成。若上方有 [WARN]/[ERR],按"快速修复建议"逐条处理。"
EOF
# 2) 赋权
chmod +x ~/diag_env.sh
# 3) 运行
~/diag_env.sh
修复
如果发现有问题,可以根据具体情况手动进行修复,也可以直接执行自动脚本进行修复,然后再自动校验一遍。
环境排错速查表
下面是一份环境排错速查表(症状 → 诊断 → 解决),聚焦 Homebrew + pyenv + venv 的常见坑。按块逐条核对即可。
1. 基线自检(先跑一遍)
架构/入口/版本/路径
uname -m
which brew
type -a python pip python3 pip3
python -V
pip -V
echo $PATH
pyenv version
期望结果:
- arm64;/opt/homebrew/bin/brew;python/pip/python3/pip3 首项均为 ~/.pyenv/shims/…;python -V 显示你设的全局版本(如 3.12.6)
2. “python/pip 找不到或跑到系统路径”
症状:
- python: command not found 或 python3 指向 /usr/bin/python3
诊断:
echo $PATH | tr ':' '\n' | nl | sed -n '1,10p'
看前几位是否含 ~/.pyenv/shims 与 /opt/homebrew/bin
解决: 把以下片段放入 ~/.bash_profile(bash)或 ~/.zprofile(zsh),并 source:
# Homebrew
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
eval "$(/opt/homebrew/bin/brew shellenv)"
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"
然后:
source ~/.bash_profile # 或 source ~/.zprofile
hash -r
3. “两个 brew / PATH 混乱”
症状:
- which -a brew 同时出现 /usr/local/bin/brew 与 /opt/homebrew/bin/brew
解决: 卸载 Intel 版 Homebrew 与残留:
/usr/local/bin/brew --version 2>/dev/null && \
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)" || true
sudo rm -rf /usr/local/Homebrew /usr/local/Caskroom /usr/local/Cellar
find /usr/local/bin -type l -lname '../Homebrew/*' -delete 2>/dev/null || true
确保 PATH 前缀只含 /opt/homebrew/bin:/opt/homebrew/sbin
4. “conda 残留污染 PATH”
症状:
- echo $PATH 出现 anaconda3,或 ~/.bash_profile / ~/.zprofile 里有 conda init 残片
解决:
sed -i '' '/conda init/d;/anaconda3/d' ~/.bash_profile ~/.zprofile 2>/dev/null || true
sudo rm -rf /opt/anaconda3
rm -rf ~/.conda ~/.continuum ~/.anaconda_backup
source ~/.bash_profile 2>/dev/null || source ~/.zprofile
hash -r
5. “pyenv 安装了,但编译 Python 失败/缺库”
症状:
- pyenv install 3.x 报 OpenSSL/Readline/zlib 等缺失
解决:
brew install openssl readline zlib bzip2 xz
export PYTHON_CONFIGURE_OPTS="--enable-shared"
# 可补充头文件/库位置(偶发需要)
export LDFLAGS="-L/opt/homebrew/opt/openssl/lib -L/opt/homebrew/opt/readline/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl/include -I/opt/homebrew/opt/readline/include"
pyenv install -s 3.12.6
pyenv global 3.12.6
pyenv rehash
6. “pip 安装包报 SSL/证书错误”
症状:
- pip install … 显示 SSL: CERTIFICATE_VERIFY_FAILED
解决:
/Applications/Python\ 3.12/Install\ Certificates.command 2>/dev/null || true # 少数情形
# 或使用 PyPI 国内镜像(可选)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -U pip setuptools wheel
7. “混用Rosetta导致架构不一致”
症状:
- Python 扩展安装时出现 wrong architecture;uname -m 有时变 x86_64
诊断:
uname -m
file "$(pyenv which python)"
解决:
- 始终使用 ARM 终端(不要"用 Rosetta 打开")
- 确保只保留 /opt/homebrew(ARM 版)
- 必要时重装对应 ARM 包
8. “IDE 还是用错解释器”
症状:
- VS Code/PyCharm 内 sys.executable 指向系统 /usr/bin/python3
解决:
- VS Code:Command Palette → “Python: Select Interpreter” → 选 项目/.venv/bin/python;或选 ~/.pyenv/versions/3.x/bin/python 后再建 venv
- PyCharm:Settings → Project → Python Interpreter → Add → Existing → 选 项目/.venv/bin/python
9. “venv 里安装了包,命令行却看不到”
症状:
- pip list 在项目里看不到刚装的包
诊断/解决:
# 是否激活了 venv?
echo "$VIRTUAL_ENV" # 为空=未激活
source .venv/bin/activate
python -m site # 确认 site-packages 是否来自 .venv
# 统一安装姿势
pip install -U pip setuptools wheel
pip install -r requirements.txt
10. “PATH 太乱/重复项很多”
解决(可选去重):
# 追加到 ~/.bash_profile 或 ~/.zprofile 末尾
export PATH="$(awk -v RS=: '!a[$0]++{s=s? s RS $0 : $0} END{print s}' <<<"$PATH")"
source ~/.bash_profile 2>/dev/null || source ~/.zprofile
hash -r
11. “快速重置当前会话环境”
用一次性会话修复把入口拉回正轨:
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
eval "$(/opt/homebrew/bin/brew shellenv)"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"
hash -r
type -a python pip; python -V; pip -V
自动修复
也可以使用自动修复一键修复。
此脚本(fix_env_auto.sh) —— 设计为交互式且幂等:只在检测到问题时才改动、所有改动都有备份、每一步都会提示确认。脚本处理项包括:
- 备份并清理残留的 Intel Homebrew(可选)
- 卸载/清理 Anaconda(可选)
- 规范并写入
/.bash_profile、/.zprofile、~/.zshrc(保留 Homebrew + pyenv 初始化,.zshrc 包含交互别名与 mkvenv/workon) - 安装(或修复)Apple-Silicon Homebrew(/opt/homebrew)
- 安装(或修复)pyenv
- 可选:通过 pyenv 安装指定 Python 版本并设为全局
- 可选:在当前目录创建示例 .venv
- 每一步都有日志与备份,可回滚(通过备份文件查看/手动恢复)
重要:脚本会询问并等待你确认再删除 Intel Homebrew / Anaconda 等可能有破坏性的操作。请在有网的终端运行(需要 curl、brew 安装等)。
使用方法
1. 保存脚本
cat > ~/fix_env_auto.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
TS="$(date +%Y%m%d-%H%M%S)"
LOG="$HOME/fix_env_auto_$TS.log"
exec > >(tee -a "$LOG") 2>&1
echo "========== fix_env_auto.sh =========="
echo "日志: $LOG"
echo
# helpers
confirm(){ local msg="$1"; read -r -p "$msg [y/N]: " a; [[ "$a" == "y" || "$a" == "Y" ]]; }
backup_file(){ local f="$1"; if [[ -f "$f" ]]; then cp -a "$f" "${f}.bak.$TS"; echo "备份 $f -> ${f}.bak.$TS"; fi }
append_once(){ local file="$1"; local marker="$2"; local block="$3"; grep -F "$marker" "$file" >/dev/null 2>&1 || { printf "\n%s\n%s\n" "$marker" "$block" >> "$file"; echo "写入片段到 $file"; } }
# 1. 基线检测
echo "1) 基线检测..."
arch="$(uname -m || true)"
echo "系统架构: $arch"
echo "当前 shell: ${SHELL:-unknown}"
echo "which -a brew: $(which -a brew 2>/dev/null || echo none)"
echo "type -a python: $(type -a python 2>/dev/null || echo none)"
echo "pyenv version: $(command -v pyenv >/dev/null 2>&1 && pyenv version || echo none)"
echo
# 2. 备份关键文件
echo "2) 备份关键 shell 配置文件..."
for f in "$HOME/.bash_profile" "$HOME/.bashrc" "$HOME/.zprofile" "$HOME/.zshrc"; do
[[ -f "$f" ]] && cp -a "$f" "${f}.bak.$TS" && echo "备份 $f -> ${f}.bak.$TS"
done
echo
# 3. 可选:卸载 Intel Homebrew
if /usr/bin/which -a brew 2>/dev/null | grep -q "/usr/local/bin/brew"; then
echo "检测到 /usr/local 下可能残留 Intel Homebrew。建议卸载以避免冲突。"
if confirm "是否卸载 Intel Homebrew (/usr/local)?"; then
echo "执行官方卸载脚本(可能需要 sudo)..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)" || true
sudo rm -rf /usr/local/Homebrew /usr/local/Caskroom /usr/local/Cellar || true
find /usr/local/bin -type l -lname '../Homebrew/*' -print -delete 2>/dev/null || true
echo "Intel Homebrew 尝试卸载完成。"
else
echo "跳过卸载 Intel Homebrew。"
fi
else
echo "未检测到 Intel Homebrew 残留。"
fi
echo
# 4. 可选:清理 Anaconda
if [[ -d "/opt/anaconda3" || -d "$HOME/.conda" || -d "$HOME/.continuum" ]]; then
echo "检测到 Anaconda/conda 残留。"
if confirm "是否删除 /opt/anaconda3 与用户目录下的 conda 文件?(会移除 conda 环境)"; then
# 从 shell 配置中移除 conda init 段(简单处理)
for f in "$HOME/.bash_profile" "$HOME/.bashrc" "$HOME/.zprofile" "$HOME/.zshrc"; do
if [[ -f "$f" ]]; then
sed -i '' '/conda init/d;/anaconda3/d;/__conda_setup/d' "$f" 2>/dev/null || true
fi
done
sudo rm -rf /opt/anaconda3 || true
rm -rf "$HOME/.conda" "$HOME/.continuum" "$HOME/.anaconda_backup" || true
echo "Anaconda 清理完成。"
else
echo "跳过 Anaconda 清理。"
fi
else
echo "未检测到 Anaconda。"
fi
echo
# 5. 写入统一的配置片段(保守替换:会追加并做幂等写入)
BASH_PROFILE="$HOME/.bash_profile"
ZPROFILE="$HOME/.zprofile"
ZSHRC="$HOME/.zshrc"
BREW_BLOCK='# --- HOME_SANE_BREW ---
if [ -d /opt/homebrew/bin ]; then
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
eval "$(/opt/homebrew/bin/brew shellenv)"
fi
# --- END HOME_SANE_BREW ---'
PYENV_BLOCK='# --- HOME_SANE_PYENV ---
export PYENV_ROOT="$HOME/.pyenv"
if [ -d "$PYENV_ROOT" ]; then
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"
fi
# --- END HOME_SANE_PYENV ---'
echo "写入/确保 ~/.bash_profile 与 ~/.zprofile 包含 Homebrew 与 pyenv 初始化片段..."
touch "$BASH_PROFILE" "$ZPROFILE"
append_once "$BASH_PROFILE" "# --- HOME_SANE_BREW ---" "$BREW_BLOCK"
append_once "$BASH_PROFILE" "# --- HOME_SANE_PYENV ---" "$PYENV_BLOCK"
append_once "$ZPROFILE" "# --- HOME_SANE_BREW ---" "$BREW_BLOCK"
append_once "$ZPROFILE" "# --- HOME_SANE_PYENV ---" "$PYENV_BLOCK"
# 确保 zshrc 加载 zprofile 并提供交互别名 + helper(若不存在则追加)
ZSHRC_BLOCK='# --- ZSH INTERACTIVE HELPERS ---
# source environment
if [ -f ~/.zprofile ]; then
source ~/.zprofile
fi
# common aliases
alias ll="ls -lh"
alias la="ls -lha"
alias gs="git status"
# pyenv helpers
mkvenv() {
local ver="${1:-$(pyenv global)}"
if ! pyenv versions --bare | grep -q "^$ver$"; then
echo "Python $ver 未安装,请先 pyenv install $ver"
return 1
fi
pyenv shell "$ver"
python -m venv .venv
source .venv/bin/activate
python -V
}
workon() {
if [ -d ".venv" ]; then
source .venv/bin/activate
echo "Activated $(python -V 2>&1)"
else
echo "当前目录没有 .venv"
fi
}
# --- END ZSH INTERACTIVE HELPERS ---'
append_once "$ZSHRC" "# --- ZSH INTERACTIVE HELPERS ---" "$ZSHRC_BLOCK"
echo "配置片段写入完成。"
echo
# 6. 安装/修复 Homebrew(ARM64)
if ! command -v /opt/homebrew/bin/brew >/dev/null 2>&1; then
echo "未检测到 /opt/homebrew/bin/brew,准备安装 Homebrew(Apple Silicon)..."
if confirm "现在联网安装 Homebrew?(需要几分钟)"; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> "$BASH_PROFILE"
eval "$(/opt/homebrew/bin/brew shellenv)"
else
echo "跳过 Homebrew 安装(你需要手动安装或确保 /opt/homebrew 存在)"
fi
else
echo "检测到 /opt/homebrew/bin/brew。尝试 brew update && brew doctor"
/opt/homebrew/bin/brew update || true
/opt/homebrew/bin/brew doctor || true
fi
echo
# 7. 确保 pyenv 安装
if ! command -v pyenv >/dev/null 2>&1; then
echo "pyenv 未安装,准备通过 brew 安装 pyenv..."
if command -v /opt/homebrew/bin/brew >/dev/null 2>&1; then
/opt/homebrew/bin/brew install pyenv || true
else
echo "brew 不可用,跳过 pyenv 安装,请手动安装 pyenv"
fi
else
echo "pyenv 已安装: $(pyenv --version 2>/dev/null || true)"
fi
# 8. 可选:安装 Python 版本并设为全局
if command -v pyenv >/dev/null 2>&1; then
if confirm "是否通过 pyenv 安装 Python 3.12.6 并设为全局?"; then
echo "安装依赖(openssl/readline/zlib 等)..."
/opt/homebrew/bin/brew install openssl readline zlib bzip2 xz || true
export PYTHON_CONFIGURE_OPTS="--enable-shared"
pyenv install -s 3.12.6
pyenv global 3.12.6
pyenv rehash || true
echo "pyenv 全局版本: $(pyenv version)"
else
echo "跳过 Python 安装。"
fi
fi
echo
# 9. 可选:在当前目录创建 .venv 示例
if confirm "是否在当前目录创建示例 .venv 并激活(用于验证)?"; then
PY_BIN="$(pyenv which python || true)"
if [[ -n "$PY_BIN" ]]; then
python -m venv .venv
source .venv/bin/activate
pip install -U pip setuptools wheel || true
echo "示例 .venv 创建并激活,python -V: $(python -V 2>/dev/null || true)"
deactivate || true
else
echo "未找到 pyenv 下的 python,可先安装 pyenv python 版本"
fi
else
echo "跳过创建示例 .venv。"
fi
echo
# 10. 收尾与自检提示
echo "收尾:载入配置并刷新 hash..."
# 尝试 source profile(不失败)
source "$BASH_PROFILE" 2>/dev/null || true
source "$ZPROFILE" 2>/dev/null || true
if [[ -f "$HOME/.zshrc" ]]; then source "$HOME/.zshrc" 2>/dev/null || true; fi
hash -r || true
echo
echo "======== 完成 ========="
echo "请新开一个终端(或 source ~/.bash_profile / source ~/.zprofile)并运行:"
echo " which brew; type -a python pip python3 pip3; python -V; pip -V; echo \$PATH; pyenv version"
echo
echo "日志保存在: $LOG"
EOF
2. 赋可执行权限并运行:
chmod +x ~/fix_env_auto.sh
~/fix_env_auto.sh
脚本会逐项询问"是否执行",并在关键改动前做备份。运行结束后请新开终端或执行 source ~/.bash_profile / source ~/.zprofile,再跑下面验收命令确认:
which brew
type -a python pip python3 pip3
python -V
pip -V
echo $PATH
pyenv version
后续使用
环境问题都修复后,后续使用python,都需要遵循以下规范:
# 固定项目 Python 版本(写入 .python-version)
cd /path/to/your/project
pyenv local 3.12.6
# 为该项目创建独立 venv
python -m venv .venv
source .venv/bin/activate
pip install -U pip setuptools wheel
# 安装依赖
pip install -r requirements.txt # 如有
# 退出
deactivate
最后建议(长期稳定三原则)
- 不全局装包:一律进项目 .venv
- 不混架构:只用 /opt/homebrew(ARM),避免 Rosetta
- 单入口:python/pip 永远来自 ~/.pyenv/shims(用 type -a 定期自检)
通过这套方案,可以彻底解决macOS下Python环境混乱的问题,建立稳定、可维护的开发环境。