You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何pip未安装requirements.txt指定的protobuf版本?

问题:如何让pip安装requirements.txt中指定版本的protobuf?

我在构建DataFlow Flex模板镜像时遇到版本冲突:requirements.txt中明确指定protobuf==3.20.3,但镜像构建完成后执行pip freeze却显示protobuf==4.21.8。

相关文件内容

requirements.txt

confluent-kafka==1.9.2
google-cloud-bigquery==3.4.0
protobuf==3.20.3
setuptools

Dockerfile

ARG TAG=latest
FROM gcr.io/dataflow-templates-base/python39-template-launcher-base:${TAG}

ARG WORKDIR=/opt/dataflow
RUN mkdir -p ${WORKDIR}
WORKDIR ${WORKDIR}

ARG TEMPLATE_NAME=dataflow_flex_test
COPY . ${WORKDIR}

ENV FLEX_TEMPLATE_PYTHON_PY_FILE=${WORKDIR}/${TEMPLATE_NAME}/main.py
ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE=${WORKDIR}/setup.py

RUN apt-get update \
    && pip install --no-cache-dir --upgrade pip \
    && pip install 'apache-beam[gcp]==2.40.0' \
    && pip install --force-reinstall -r ${WORKDIR}/requirements.txt \
    && pip freeze

RUN python setup.py install
ENV PIP_NO_DEPS=True

setup.py

import setuptools

setuptools.setup(
    name='dataflow-flex-test',
    version='0.1.0',
    install_requires=[],
    packages=setuptools.find_packages(),
    include_package_data=True,
    description='dataflow flex test',
    author='XX'
)

解决方案

问题根源

版本被覆盖的原因是Dockerfile的执行顺序:

  1. 先安装apache-beam[gcp]==2.40.0,其依赖链会引入高版本protobuf
  2. 执行pip install --force-reinstall -r requirements.txt后,protobuf确实会被降级到3.20.3
  3. 但后续的python setup.py install会触发setuptools重新解析环境依赖,DataFlow基础镜像或beam的隐式依赖会再次拉取高版本protobuf,覆盖之前的指定版本

修复方案

方案1:调整安装顺序

将python setup.py install移到requirements.txt安装之前,让最后执行的依赖安装锁定版本:

RUN apt-get update \
    && pip install --no-cache-dir --upgrade pip \
    && pip install 'apache-beam[gcp]==2.40.0' \
    && python setup.py install \
    && pip install --force-reinstall -r ${WORKDIR}/requirements.txt \
    && pip freeze

方案2:在setup.py中显式锁定protobuf版本

即使install_requires为空,也可以添加指定版本的依赖,确保安装过程中不会被替换:

import setuptools

setuptools.setup(
    name='dataflow-flex-test',
    version='0.1.0',
    install_requires=[
        'protobuf==3.20.3'
    ],
    packages=setuptools.find_packages(),
    include_package_data=True,
    description='dataflow flex test',
    author='XX'
)

方案3:用pip安装本地包替代setup.py install

python setup.py install是旧版安装方式,改用pip安装并禁用自动依赖安装,避免隐式升级:
将Dockerfile中的RUN python setup.py install替换为:

RUN pip install --no-deps .

内容的提问来源于stack exchange,提问作者CClarke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:52:53