CentOS 7 云服务器部署踩坑记(四):Python 包安装与 GCC 版本问题

背景#

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.3

numpy 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
deactivate

Flask 应用#

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 是最省事的选择。


上一篇:Hugo 博客部署与 Nginx 配置
下一篇:Supervisor 进程管理与应用启动