python - 使用 conda 和 pip 时,如何在 Python 中固定版本化依赖项?

标签 python conda pip-tools

我正在尝试遵循安装完全固定依赖项的最佳实践(对于可重复构建和更好的 Docker 缓存,请参阅 this pythonspeed.com article)。
我的项目需要同时使用 conda 和 pip(conda 用于复杂的 ML 包,pip 用于 conda 上不可用的东西)。 conda-lockpip-compile工具能够在固定版本中生成所有传递依赖项。但是,这些工具是独立 : 当我运行 pip-compile 时,它​​不知道 conda-lock 要安装的依赖项,反之亦然。
这会导致不同的包版本,导致 Docker 镜像中的空间浪费,并可能导致损坏/不兼容,如 pip install step 安装一些可传递依赖项的不同版本。
在使用 时,有没有人有更好的解决方案来创建固定的 Python 依赖项列表? conda 和 pip ?
(编辑:这是关于 conda-lock 的 github 票证,用于支持 pip 依赖项:https://github.com/conda-incubator/conda-lock/issues/4)

最佳答案

您可以安装所有依赖项,然后使用 conda env export,而不是使用解决依赖项的工具。生成固定/版本化 environment.yaml .
主要缺点:重量较重,因为它实际上必须安装所有依赖项。从好的方面来说,您最终只有一个环境“规范”环境文件作为输入,以及一个环境“锁定”文件作为输出。
在 environment-spec.yaml 中指定直接依赖项
一起指定 conda 和 pip 依赖项。例子:

name: base
channels:
  - conda-forge
  - defaults
  # etc.
dependencies:
  - matplotlib
  - pandas
  - pip  # needed to have a pip section below
  - scikit-learn
  - pip:
    - pyplot_themes  # only available on PyPI
安装依赖项并导出固定版本(包括传递依赖项)
这可以直接在你的本地机器上完成,但这里是如何在 Docker 中隔离这个过程:
# syntax=docker/dockerfile:1

# Note: using miniconda instead of micromamba because micromamba lacks the
# `conda env export` command.
FROM continuumio/miniconda3:4.9.2

COPY environment-spec.yml /environment-spec.yml
# mounts are for conda caching and pip caching
RUN --mount=type=cache,target=/opt/conda/pkgs --mount=type=cache,target=/root/.cache \
    conda env create -n regen_env --file /environment-spec.yml

# Export dependencies.
RUN conda env export -n regen_env > /environment-lock-raw.yml
CMD ["cat", "/environment-lock.yml"]
然后你可以像这样创建一个固定的环境文件(假设上面的 dockerfile 被命名为 regen_environment.Dockerfile ):
docker build -t regen_env -f regen_enviroment.Dockerfile .
docker run --rm regen_env > environment-lock.yaml
这会将固定环境文件输出到 environment-lock.yaml ,然后您可以使用 conda install -f environment-lock.yaml 安装它.
(这是一个包含更多引用资料和详细信息的要点:https://gist.github.com/jli/b2d2d62ad44b7fcb5101502c08dca1ae)

关于python - 使用 conda 和 pip 时,如何在 Python 中固定版本化依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68171629/

相关文章:

python - 为什么 pip-tools 无法推断正确的版本?

python - 如何阅读《Learn python the Hard way》中练习41的代码?

python - 如何从 jupyter 笔记本中删除停用的 conda 环境名称?

python - window : Anaconda 'python' is not recognized as an internal or external command on CMD (Updated)

python - 使用 Conda 创建像 Anaconda 这样的自定义安装程序

python - 是否可以使用最旧的依赖项来 pip 编译requirements.txt?

python - 在 python 中复制并粘贴文本

python - 我可以在没有 bjam 的情况下编译 boost.python 模块吗?

python - 如何根据 csv 文件中的重复数字制作具有单个值的字典