python - 管理 conda 和 pip 之间依赖关系的最佳实践
问题描述
我正在开发一个 Python 库,它依赖于多个包。我正在努力寻找最直接的方法来管理具有以下约束的所有这些依赖项:
- 其中一些依赖项只能作为 conda 包提供(技术上源是可用的,但构建过程不是我想要进入的东西)
- 其他依赖项只能通过 pip 获得
- 我需要以可编辑或开发者模式安装我自己的库
- 我经常需要使依赖项保持最新
我当前的初始安装设置:
- 创建一个新的 conda 环境
- 安装 conda-only 依赖项
conda install ...
- 安装我的图书馆
pip install -e .
此时,一些包已经安装,现在由 conda 管理,其他包由 pip 管理。当我想更新我的环境时,我需要:
- 更新环境的 conda 部分
conda update --all
- 手动更新环境的pip部分
我的问题是这是不稳定的:当我更新所有 conda 包时,它确保了它管理的包的一致性。但是,我不能保证整个环境保持一致,我刚刚意识到我错过了一些更新,因为我忘记检查环境的 pip 部分中的更新。
最好的方法是什么?我想过:
- 使用 conda 的pip 互操作性功能:这似乎可行,但我得到了一些可疑的结果,可能是因为我使用了extras_require
- 由于 pip 可以看到 conda 包,因此初始安装是一致的,这意味着我可以在需要更新时简单地重新安装所有内容。这有效,但并不完全优雅。
解决方案
官方文档中关于管理同样需要 PyPI 来源或安装的本地包的 Conda 环境的建议pip
是在 YAML 文件中定义所有依赖项(Conda 和 Pip)。就像是:
环境.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
就个人而言,我倾向于创建新的环境,而不是改变(更新)现有的环境,并>=version
在 YAML 中使用最小的约束(即 )。创建新环境时,它应该自动拉取最新的一致包。另外,可以保留 env 的先前实例,以防在开发生命周期中需要回归。
推荐阅读
- python - Flask / Waitress 服务器在一段时间后随机进入 100% CPU 使用率
- swift - `String` 的 `contains("\n")` 在字符串中有返回时返回 false
- reporting-services - 如何在 SSRS 报告中切换数据源
- javascript - 如何从geojson为mapbox GL获取'line-dasharray'值
- haskell - 泛型:具有实例的类型的运行时 ADT
- json - 通过 json 数组映射来渲染屏幕 React Native
- python-3.x - 如何在使用 Flutter 的同时开发后端
- mysql - MySQL8.20中服务器请求客户端未知的身份验证方法
- python - 根据另一列值删除字符串中的单词
- azure-functions - 如何解决 Alexa 问题请求的技能响应?