macOS移除内置Python 2后怎么重新安装
详解 macOS 12.3 移除内置 Python 2 之后的重新安装与环境恢复方案。涵盖系统只读限制、Pyenv 源码编译安装、官方安装包配置、PATH 优先级映射以及现代 Clang/OpenSSL 编译避坑指南。
/usr/bin/python)。由于系统根目录启用了只读保护,我们无法直接将 Python 2 放回系统原有路径;最稳妥、可维护的解决方案是借助版本管理工具 Pyenv 在用户目录进行编译安装,或安装官方独立包并通过环境变量 PATH 进行路径劫持。本文将提供清晰完整的操作步骤与排错说明。
一、系统限制解析:为什么不能直接写回系统目录
当老旧脚本抛出 zsh: command not found: python 或 env: python: No such file or directory 时,许多初学者第一反应是尝试下载二进制文件直接拷贝到 /usr/bin/。然而在现代 macOS 下,即使以 sudo 权限执行,也会直接提示 Read-only file system 或 Operation not permitted。
这是因为从 macOS Catalina 开始,苹果将系统核心与用户数据划分为两个独立卷,系统卷受到 SIP(系统完整性保护) 和 SSV(签名系统卷) 的硬件级加密校验保护。除了官方系统OTA升级外,任何对 /usr/bin、/System 等路径的写操作都会被系统内核直接拒绝。
因此,重新获得 python 命令的合理做法是将 Python 2 安装到不受 SIP 限制的用户可写区域(例如 ~/.pyenv/ 或 /usr/local/bin/),并依靠 Shell 的环境变量查找顺序($PATH),让终端和脚本优先解析并使用我们安装的 Python 2。
二、准备工作:安装构建工具链与历史依赖库
Python 2.7 最终版本为 2.7.18。在较新的 macOS(如 Monterey、Ventura、Sonoma 等)中,现代系统自带的 Apple Clang 编译器默认使用了更加严苛的 C 语言标准,且 Homebrew 默认已经废弃了旧版 OpenSSL 1.1 的通用链接。因此在执行安装前,需要先行安装编译工具链与必要的依赖库。
第一步:安装 Xcode 命令行开发者工具
打开终端(Terminal),执行以下命令:
xcode-select --install
在弹出的系统对话框中点击“安装”,等待工具链下载与配置完成。如果此前已经安装过,终端会提示已存在,直接进入下一步。
第二步:通过 Homebrew 安装构建与加密依赖
Python 2.7 依赖 openssl@1.1 和 readline 提供网络加密与交互终端功能。在终端中执行:
brew install pyenv openssl@1.1 readline zlib
openssl@1.1,否则在后续编译时会产生 _ssl 模块构建失败的错误。
三、推荐方案:使用 Pyenv 源码编译安装 Python 2.7
使用 Pyenv 是在现代 macOS 下管理多版本 Python 的工业级方案。它不会修改系统系统级目录,并且可以随时在不同项目间无缝切换版本。
步骤 1:注入编译标志并执行安装
由于现代 macOS 的 Clang 编译器将隐式函数声明视为致命错误(-Werror=implicit-function-declaration),为了让陈旧的 Python 2.7.18 源码顺利通过编译,必须在安装时注入特定的编译宽容参数与 OpenSSL 路径。在终端中运行完整命令:
CFLAGS="-I$(brew --prefix openssl@1.1)/include -I$(brew --prefix readline)/include -Wno-error=implicit-function-declaration" \
LDFLAGS="-L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix readline)/lib" \
pyenv install 2.7.18
安装过程会拉取 Python 2.7.18 官方源码包并在本地完成编译。如果终端最后输出 Installed Python-2.7.18 to /Users/.../.pyenv/versions/2.7.18,则表明编译成功。
步骤 2:配置 Shell 环境变量(以默认的 zsh 为例)
macOS 默认 Shell 为 zsh。我们需要将 Pyenv 的垫片(shims)机制注册到 ~/.zshrc 中,使终端可以正确接管 python 命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc
步骤 3:激活版本与结果验证
Pyenv 允许全局激活或针对特定项目目录局部激活。为了全面修复系统缺失 python 命令的现状,通常可以将其设为全局默认版本,或在需要运行老旧脚本的工程目录下局部生效:
# 全局启用 Python 2.7.18
pyenv global 2.7.18
# 验证安装与运行版本
python --version
which python
终端预期输出示例:
Python 2.7.18
/Users/yourname/.pyenv/shims/python
四、备用方案:安装 Python 官方历史安装包
如果你的设备无法联网安装 Homebrew,或者编译源码时因 Xcode 依赖版本发生不可调和的冲突,可以选择使用 Python 官方归档的 macOS 专用 pkg 安装包。
1. 获取并安装官方 DMG 包
访问 Python 官方归档页面下载最后一个 Python 2 版本:python-2.7.18-macosx10.9.pkg。双击运行安装向导,遵循默认设置一路“继续”完成安装。该安装程序会将运行时置于:
/Library/Frameworks/Python.framework/Versions/2.7/
并在 /usr/local/bin/ 目录下生成 python2、python2.7 以及 idle 等命令行工具。
2. 在 /usr/local/bin 补齐软链接
官方安装包为了防止覆盖系统原有指令,默认可能只提供 python2.7,而老脚本常常硬编码调用 python。我们可以在不受 SIP 限制的 /usr/local/bin 目录下建立软链接:
sudo ln -sf /usr/local/bin/python2.7 /usr/local/bin/python
随后检查终端的环境变量 echo $PATH,确保 /usr/local/bin 出现在 /usr/bin 之前即可直接生效。
五、常见避坑指南:现代 macOS 运行 Python 2 的排错
由于 Python 2 已于 2020 年 1 月 1 日终止技术维护(EOL),在 Apple Silicon(M1/M2/M3/M4)芯片及新版 macOS 下运行老版本时,通常会遇到以下三个典型故障:
1. pip 与 SSL 根证书过期的处理方法
Python 2 安装完成后,如果直接运行 pip install,经常会遇到 SSL: CERTIFICATE_VERIFY_FAILED 错误。这是因为 Python 2 捆绑的 CA 根证书库已经多年未更新。
如果是使用官方 DMG 安装包安装的,可以在“应用程序”文件夹内找到 Python 2.7 目录,双击运行其中的 Install Certificates.command 脚本。
如果是使用 Pyenv 编译安装的,可直接通过 PyPA 官方为 Python 2.7 归档的独立引导脚本重新安装包含更新证书的 pip:
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python get-pip.py
rm get-pip.py
2. Apple Silicon (M1/M2/M3/M4) 架构兼容性提示
Python 2.7 源码并未原生针对 Apple Silicon 的 arm64 进行完整优化。虽然 Pyenv 已经合入了社区针对 macOS arm64 架构的基础修补补丁,但如果你的脚本需要使用部分极为古老的第三方 C 扩展模块,依然可能因缺少 arm64 机器码而构建失败。这种情况下,可以为终端开启 Rosetta 2 兼容层执行编译:
# 在 x86_64 仿真环境下运行编译命令
arch -x86_64 pyenv install 2.7.18
六、安装途径对比与选型建议
针对现代 macOS 环境下 Python 2 的重新获得途径,我们对三种主要策略进行横向对比,帮助读者根据具体使用场景进行选型:
七、总结与长期维护建议
macOS 移除内置 Python 2 是操作系统现代化与安全演进的必然结果。通过上述介绍的 Pyenv 源码安装 或 官方独立安装包 + 软链接,我们能够在不破坏 macOS 系统只读完整性的前提下,完整找回 python 命令的执行能力,确保历史脚本、老旧自动化工具正常运作。
不过从长远来看,Python 2 已经失去上游安全更新支持多年。重新安装仅应作为解决“燃眉之急”的过渡手段。对于个人日常编写的脚本,建议使用官方工具 2to3 进行语法升级,并逐步将脚本首行的解释器声明更新为 #!/usr/bin/env python3,彻底脱离对 Python 2 的依赖。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









