首页 > 解决方案 > 如何解释这个 python 依赖树?

问题描述

我们正在使用 conda 来维护 python 环境,我想了解为什么在最新可用版本为https://pypi.org/project/google-cloud-时安装google-cloud-bigquery==1.22.0 bigquery/2.16.1/和 conda-forge 上的最新 vaailable 版本 ( https://anaconda.org/conda-forge/google-cloud-bigquery ) 是 2.15.0

这是构建我们的 conda 环境的 Dockerfile:

FROM debian:stretch-slim

RUN apt-get update && apt-get install curl gnupg -y && rm -rf /var/lib/apt/lists/*

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUN curl https://repo.anaconda.com/pkgs/misc/gpgkeys/anaconda.asc | gpg --dearmor > conda.gpg && \
        install -o root -g root -m 644 conda.gpg /usr/share/keyrings/conda-archive-keyring.gpg && \
        gpg --keyring /usr/share/keyrings/conda-archive-keyring.gpg --no-default-keyring \
        --fingerprint 34161F5BF5EB1D4BFBBB8F0A8AEB4F8B29D82806 && \
        echo "deb [arch=amd64 signed-by=/usr/share/keyrings/conda-archive-keyring.gpg] https://repo.anaconda.com/pkgs/misc/debrepo/conda stable main" \
        > /etc/apt/sources.list.d/conda.list

WORKDIR /tmp
RUN MINICONDA_VERSION=4.9.2 && \
        CONDA_VERSION='4.9.*' && \
        CONDA_DIR=/opt/conda && \
        curl -O https://repo.anaconda.com/miniconda/Miniconda3-py37_${MINICONDA_VERSION}-Linux-x86_64.sh && \
        /bin/bash Miniconda3-py37_${MINICONDA_VERSION}-Linux-x86_64.sh -f -b -p $CONDA_DIR && \
        rm Miniconda3-py37_${MINICONDA_VERSION}-Linux-x86_64.sh && \
        $CONDA_DIR/bin/conda config --system --set auto_update_conda false && \
        $CONDA_DIR/bin/conda config --system --set show_channel_urls true && \
        $CONDA_DIR/bin/conda config --system --remove channels defaults && \
        $CONDA_DIR/bin/conda config --system --add channels main && \
        $CONDA_DIR/bin/conda config --system --set env_prompt '({name}) ' && \
        $CONDA_DIR/bin/conda config --system --append envs_dirs /opt/conda/envs/ && \
        $CONDA_DIR/bin/conda config --system --append pkgs_dirs /opt/conda/pkgs/ && \
        $CONDA_DIR/bin/conda update --quiet --yes --all conda="${CONDA_VERSION}" && \
        $CONDA_DIR/bin/conda config --system --append channels conda-forge  && \
        $CONDA_DIR/bin/conda create -n py3 python=3.8

RUN bash -c "source /opt/conda/bin/activate /opt/conda/envs/py3 && conda install \
                invoke \
                apache-beam \
                sh \
                pytest \
                pytest-xdist \
                ipython \
                behave \
                black \
                pylint \
                flake8 \
                jinja2 \
                tenacity \
                responses \
                tqdm \
                google-api-python-client \
                google-auth-oauthlib \
                google-cloud-monitoring \
                google-cloud-bigquery \
                google-cloud-storage \
                google-cloud-pubsub \
                google-cloud-secret-manager \
                ipdb \
                rope \
                pipdeptree"

我使用它构建它docker build . -t conda-env,然后pipdeptree在容器内使用它来为我提供 google-cloud-bigquery 的依赖关系树:

docker run \
  --rm \
  --entrypoint bash \
  conda-env \
  -c "source /opt/conda/bin/activate /opt/conda/envs/py3 && pipdeptree --packages google-cloud-bigquery"

这给了我这个:

google-cloud-bigquery==1.22.0
  - google-cloud-core [required: >=1.0.3,<2.0dev, installed: 1.6.0]
    - google-api-core [required: >=1.21.0,<2.0.0dev, installed: 1.25.1]
      - google-auth [required: >=1.21.1,<2.0dev, installed: 1.28.1]
        - cachetools [required: >=2.0.0,<5.0, installed: 4.2.1]
        - pyasn1-modules [required: >=0.2.1, installed: 0.2.8]
          - pyasn1 [required: >=0.4.6,<0.5.0, installed: 0.4.8]
        - rsa [required: >=3.1.4,<5, installed: 4.7.2]
          - pyasn1 [required: >=0.1.3, installed: 0.4.8]
        - setuptools [required: >=40.3.0, installed: 52.0.0.post20210125]
        - six [required: >=1.9.0, installed: 1.15.0]
      - googleapis-common-protos [required: >=1.6.0,<2.0dev, installed: 1.53.0]
        - protobuf [required: >=3.12.0, installed: 3.14.0]
          - six [required: >=1.9, installed: 1.15.0]
      - protobuf [required: >=3.12.0, installed: 3.14.0]
        - six [required: >=1.9, installed: 1.15.0]
      - pytz [required: Any, installed: 2021.1]
      - requests [required: >=2.18.0,<3.0.0dev, installed: 2.25.1]
        - certifi [required: >=2017.4.17, installed: 2020.12.5]
        - chardet [required: >=3.0.2,<5, installed: 3.0.4]
        - idna [required: >=2.5,<3, installed: 2.10]
        - urllib3 [required: >=1.21.1,<1.27, installed: 1.26.4]
      - setuptools [required: >=40.3.0, installed: 52.0.0.post20210125]
      - six [required: >=1.13.0, installed: 1.15.0]
    - google-auth [required: >=1.24.0,<2.0dev, installed: 1.28.1]
      - cachetools [required: >=2.0.0,<5.0, installed: 4.2.1]
      - pyasn1-modules [required: >=0.2.1, installed: 0.2.8]
        - pyasn1 [required: >=0.4.6,<0.5.0, installed: 0.4.8]
      - rsa [required: >=3.1.4,<5, installed: 4.7.2]
        - pyasn1 [required: >=0.1.3, installed: 0.4.8]
      - setuptools [required: >=40.3.0, installed: 52.0.0.post20210125]
      - six [required: >=1.9.0, installed: 1.15.0]
    - six [required: >=1.12.0, installed: 1.15.0]
  - google-resumable-media [required: >=0.3.1,<0.6.0dev,!=0.4.0, installed: 0.5.1]
    - six [required: Any, installed: 1.15.0]
  - protobuf [required: >=3.6.0, installed: 3.14.0]
    - six [required: >=1.9, installed: 1.15.0]

我必须举起手承认我根本不知道如何解释。例如,这样做:

google-cloud-bigquery==1.22.0
  - google-cloud-core [required: >=1.0.3,<2.0dev, installed: 1.6.0]

意味着 google-cloud-core 强制 google-cloud-bigquery 为 ">=1.0.3,<2.0dev" 还是意味着 google-cloud-core 被其他东西强制为 ">=1.0.3 ,<2.0dev”。我基本上不明白提供给我的信息,所以我希望有人能启发我。更好的是,如果有人能告诉我如何安装更高版本的google-cloud-bigquery,我将不胜感激,因为 1.22.0 中存在已知错误。

标签: pythonconda

解决方案


先回答你的最后一个问题:

google-cloud-bigquery==1.22.0
  - google-cloud-core [required: >=1.0.3,<2.0dev, installed: 1.6.0]

意味着google-cloud-bigquery安装了 1.22.0 版本,需要google-cloud-core安装 1.0.3 和 2.0 之间的版本,并且您安装了 1.6.0 版本。

google-cloud-bigquery要检查您可能正在尝试执行的 - 的约束,请添加这样的--reverse标志:pipdeptree --reverse --packages google-cloud-bigquery. 但是输出没有用,因为“你看错了树的一面”:

Warning!!! Possibly conflicting dependencies found:
* pylint==2.7.4
 - astroid [required: >=2.5.2,<2.7, installed: 2.5]
* flake8==3.9.0
 - pycodestyle [required: >=2.7.0,<2.8.0, installed: 2.6.0]
 - pyflakes [required: >=2.3.0,<2.4.0, installed: 2.2.0]
------------------------------------------------------------------------
google-cloud-bigquery==1.22.0

所以要看实际的克制,跑去pipdeptree --reversegoogle-cloud-bigquery。然后你会发现,urllib3在1.26.4版本约束requests到2.25.1版本,哪些约束google-api-core到1.25.1,哪些约束google-cloud-core到1.6.0,哪些约束google-cloud-bigquery到1.22.0。

如果我不得不猜测,我会说已经在它们各自的版本中安装了其中一个提到的软件包(编辑:甚至在您安装特定软件包之前),这导致了您所看到的。

我在pip install google-cloud-bigquery --upgrade你的构建之上运行,它工作得非常好,所以你可以在最后运行它,或者在安装你的特定东西之前升级所有包(我个人建议,更新你的基础总是一个好主意。那话虽如此,如果您自己的约束“太旧”,那将无法正常工作,您应该在安装特定的东西后退回到升级)。


推荐阅读