我的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

解读

  1. Homebrew (/opt/homebrew)

    • 管理系统级依赖(编译 Python 需要的 openssl/zlib 等)
    • 只保留 ARM64 版,删除 Intel 版
  2. pyenv (~/.pyenv)

    • 统一管理多版本 Python
    • ~/.pyenv/shims 作为唯一入口,确保 python/pip 调用一致
  3. venv (每项目 .venv)

    • 在项目目录下隔离依赖,避免全局污染
    • mkvenv 快捷创建,workon 快捷激活
  4. 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

最后建议(长期稳定三原则)

  1. 不全局装包:一律进项目 .venv
  2. 不混架构:只用 /opt/homebrew(ARM),避免 Rosetta
  3. 单入口:python/pip 永远来自 ~/.pyenv/shims(用 type -a 定期自检)

通过这套方案,可以彻底解决macOS下Python环境混乱的问题,建立稳定、可维护的开发环境。