背景#
Python 3.11 装好了,开始安装 Streamlit 和 Flask 的依赖,结果又一堆报错——根本原因是 CentOS 7 自带的 GCC 是 4.8.5,而 numpy 2.x 要求 GCC 9.3+,没法编译。
核心解法:对需要编译的包,强制使用预编译的 wheel 文件,同时锁定兼容旧版 GCC 的版本号。
问题一:greenlet 编译失败#
报错信息:
error: command '/usr/bin/gcc' failed with exit code 1
ERROR: Failed building wheel for greenlet方式一:安装编译依赖
sudo yum install -y gcc python3-devel libffi-devel
pip install greenlet方式二:直接用预编译版本(推荐)
pip install --only-binary=:all: greenlet==3.0.3问题二:numpy 要求 GCC >= 9.3#
报错信息:
../meson.build:25:4: ERROR: Problem encountered: NumPy requires GCC >= 9.3numpy 2.x 使用 Meson 构建,要求较新的 GCC,CentOS 7 的 4.8.5 不满足。解决方式是安装旧版预编译包:
pip install --only-binary=:all: numpy==1.24.4注意:Python 3.13 太新,没有 numpy 1.24.4 的预编译包。建议使用 Python 3.11。
问题三:缺少 C++ 编译器#
报错信息:
Running `c++ --version` gave "[Errno 2] No such file or directory: 'c++'"sudo yum install -y gcc-c++问题四:装 Streamlit 时又去拉最新版 numpy#
已经装了 numpy==1.24.4,但安装 streamlit 时又触发了 numpy 2.x 的编译。
原因是 streamlit 的某些依赖(如 pyarrow)在构建时需要 numpy,pip 会自动拉最新版。
解决办法:先把所有需要编译的包都用旧版装好,再装 streamlit:
# 先装
pip install --only-binary=:all: \
numpy==1.24.4 \
pandas==2.0.3 \
pyarrow==14.0.2 \
greenlet==3.0.3
# 再装
pip install streamlit==1.32.0问题五:YUM 仓库失效(SCL)#
报错信息:
Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64之前尝试安装 devtoolset 时添加了 SCL 仓库,但 CentOS 7 官方源已停维护。直接禁用:
sudo yum-config-manager --disable centos-sclo-rh
# 或删除
sudo rm -f /etc/yum.repos.d/CentOS-SCLo-scl*.repo
sudo yum clean all完整安装流程#
Streamlit 应用#
cd /var/www/streamlit-app
python3.11 -m venv venv
source venv/bin/activate
pip install --upgrade pip
# 关键:先装需要编译的包的兼容版本
pip install --only-binary=:all: \
numpy==1.24.4 \
pandas==2.0.3 \
pyarrow==14.0.2 \
greenlet==3.0.3
pip install streamlit==1.32.0
pip install -r requirements.txt
deactivateFlask 应用#
cd /var/www/flask-app
python3.11 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install flask gunicorn
pip install -r requirements.txt
deactivate兼容版本对照表#
CentOS 7 + Python 3.11 环境下测试可用的版本:
| 包名 | 推荐版本 | 安装命令 |
|---|---|---|
| numpy | 1.24.4 | pip install --only-binary=:all: numpy==1.24.4 |
| pandas | 2.0.3 | pip install --only-binary=:all: pandas==2.0.3 |
| pyarrow | 14.0.2 | pip install --only-binary=:all: pyarrow==14.0.2 |
| greenlet | 3.0.3 | pip install --only-binary=:all: greenlet==3.0.3 |
| streamlit | 1.32.0 | pip install streamlit==1.32.0 |
| flask | 最新 | pip install flask |
| gunicorn | 最新 | pip install gunicorn |
问题汇总#
| 问题 | 根因 | 解决方案 |
|---|---|---|
| greenlet 编译失败 | 缺少开发包 | 用预编译版本 |
| numpy 需要新 GCC | 系统 GCC 太旧 | 锁定旧版本 |
| 缺少 C++ 编译器 | 未安装 g++ | yum install gcc-c++ |
| 依赖版本冲突 | pip 自动升级 | 先装依赖再装主包 |
| YUM 仓库失效 | CentOS 7 停止维护 | 禁用或删除仓库 |
几条经验#
Python 版本选 3.11,兼容性目前最好,3.13 太新,很多包没有预编译。--only-binary=:all: 这个参数非常有用,强制只用 wheel,避免所有编译问题。如果这些都解决不了,换 Rocky Linux 9 或 Ubuntu 22.04 是最省事的选择。