Docker中使用CBC求解器运行Pyomo时出现numpy属性错误
问题解决:AttributeError: 'numpy.float64' object has no attribute 'polynomial_degree'
这个错误和CBC求解器路径无关,本质是Pyomo与Numpy版本不兼容导致的。Numpy 1.24.x移除了numpy.float64对象的polynomial_degree属性,而Pyomo 6.6.1的部分代码仍依赖该属性,因此触发报错。
解决方案
1. 调整Numpy版本
修改requirements.txt,将Numpy降级到Pyomo 6.6.1兼容的版本:
numpy==1.23.5 pandas==2.0.2 pyomo==6.6.1 streamlit==1.23.1 streamlit-aggrid==0.3.4.post3
2. 简化Dockerfile(可选但推荐)
你当前用Brew安装CBC属于冗余操作,Debian/Ubuntu系统可直接通过apt安装CBC,既避免路径配置问题,又减少镜像体积:
FROM python:3.9-slim WORKDIR /app COPY . . ENV DEBIAN_FRONTEND=noninteractive # 直接通过apt安装CBC和其他依赖 RUN apt-get update && apt-get install -y \ build-essential \ gcc \ libglpk-dev \ glpk-utils \ coinor-cbc \ # 新增:直接安装CBC求解器 curl \ git \ software-properties-common \ && rm -rf /var/lib/apt/lists/* # 创建虚拟环境并安装依赖 RUN python3 -m venv venv \ && . venv/bin/activate \ && python3 -m pip install --upgrade pip \ && pip3 install -r requirements.txt # 配置环境变量,确保虚拟环境和求解器在PATH中 ENV PATH="/app/venv/bin:/usr/bin:$PATH" EXPOSE 8501 HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
3. 验证修改
重新构建镜像并运行容器:
docker build -t pyomo-app . docker run -p 8501:8501 pyomo-app
如果需要确认CBC是否可用,可以在Python代码中添加以下验证:
from pyomo.environ import SolverFactory solver = SolverFactory('cbc') print(f"CBC solver available: {solver.available()}")
内容的提问来源于stack exchange,提问作者Ahmed Akhtar
相关产品推荐
相关产品推荐

