【问题标题】:Best practice to manage dependencies between conda and pip管理 conda 和 pip 之间依赖关系的最佳实践
【发布时间】:2020-08-12 16:35:21
【问题描述】:

我正在开发一个 Python 库,它依赖于多个包。我正在努力寻找最直接的方法来管理所有这些依赖项,并具有以下约束:

  • 其中一些依赖项仅作为 conda 包提供(技术上源代码可用,但构建过程不是我想要了解的内容)
  • 其他依赖项只能通过 pip 获得
  • 我需要在可编辑或开发者模式下安装我自己的库
  • 我需要定期更新依赖项

我当前的初始安装设置:

  • 创建新的 conda 环境
  • 使用conda install ... 安装仅 conda 依赖项
  • 使用pip install -e . 安装我的库

此时,一些包已安装,现在由 conda 管理,其他包由 pip 管理。当我想更新我的环境时,我需要:

  • conda update --all更新环境的conda部分
  • 手动更新环境的 pip 部分

我的问题是这是不稳定的:当我更新所有 conda 包时,它确保了它管理的包的一致性。但是,我不能保证整个环境保持一致,我只是意识到我错过了一些更新,因为我忘记检查环境的 pip 部分中的更新。

最好的方法是什么?我想到了:

  • 使用 conda 的 pip interoperability feature :这似乎可行,但我得到了一些可疑的结果,可能是因为我使用了 extras_require
  • 由于 pip 可以看到 conda 包,初始安装是一致的,这意味着我可以在需要更新时简单地重新安装所有内容。这可行,但并不完全优雅。

【问题讨论】:

  • anaconda.com/blog/using-pip-in-a-conda-environment 可能是一个很好的起点。
  • 是的,这是我为了解当前工作流程而阅读的内容之一。虽然它在初始安装时工作得相对较好,但当它同时由 conda 和 pip 管理时,很难使环境保持最新。
  • 将更新逻辑包装在脚本中可以解决您的问题吗?例如,执行 update.sh(update.sh 包含更新 conda/pip 环境的所有逻辑)?

标签: python pip conda


【解决方案1】:

the official documentation 中关于管理同样需要 PyPI 来源或pip 安装的本地包的 Conda 环境的建议是在 YAML 文件中定义所有依赖项(Conda 和 Pip)。比如:

env.yaml

name: my_env
channels:
 - defaults
dependencies:
 - python=3.8
 - numpy
 - pip
 - pip:
   - some_pypi_only_pkg
   - -e path/to/a/local/pkg

在这种环境中更新的工作流程是更新 YAML 文件(我建议将其置于版本控制之下),然后创建新环境或使用

conda env update -f env.yaml

就个人而言,我倾向于创建新的环境,而不是改变(更新)现有环境,并在 YAML 中使用最小的约束(即>=version)。创建新环境时,它应该自动拉取最新的一致包。另外,可以保留 env 的先前实例,以防在开发生命周期中需要回归。

【讨论】:

  • 谢谢,这似乎是最好的做事方式。作为后续问题:您如何建议我指定开发包(短绒、测试、文档等)的要求?
  • @ClémentMasson 据我了解,这些应该包含在setup.py 的适当变量下,例如tests_require,类似于任何运行时依赖项。在 Conda 中工作提供了让 Conda 预先安装工作环境所需的机会(并且避免不得不为原生依赖项而烦恼)的机会,但 setup.py 仍然是应声明正在开发的包的所有依赖项的地方。跨度>
  • 现在我找到了一个适合我需要的解决方案:我在 requirements.txt 文件中单独指定了测试要求(并且 setup.py 不包含任何内容)。这允许使用与conda env update -f env.yml -f test_requirements.txt 相同的命令进行更新。这可能不是最干净的做事方式,但它足以满足我的需要。谢谢!
猜你喜欢
  • 2021-11-03
  • 2015-07-29
  • 2022-08-09
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多