如何解决管理conda和pip之间的依赖关系的最佳做法
我正在开发一个Python库,该库依赖于多个软件包。我正在努力寻找最简单的方法来管理具有以下约束的所有依赖项:
- 其中一些依赖项仅作为conda包提供(从技术上讲,源是可用的,但是我不想进入构建过程)
- 其他依赖项只能通过pip获得
- 我需要以可编辑或开发人员模式安装自己的库
- 我经常需要保持依赖关系为最新状态
我当前的初始安装设置:
- 创建新的conda环境
- 使用
conda install ...
安装仅conda依赖项
- 使用
pip install -e .
安装我的媒体库
这时,一些软件包已经安装,现在由conda管理,另一些则由pip管理。当我想更新我的环境时,我需要:
- 使用
conda update --all
更新环境的conda部分
- 手动更新环境的点子部分
我的问题是,这很不稳定:当我更新所有conda软件包时,它可以确保所管理的软件包的一致性。但是,我不能保证整个环境都保持一致,我只是意识到我错过了一些更新,因为我忘了检查环境中pip部分的更新。
执行此操作的最佳方法是什么?我想到了:
- 使用conda的pip interoperability feature:似乎可行,但是我有一些可疑的结果,可能是因为我使用了 extras_require
- 由于pip可以看到conda软件包,因此初始安装是一致的,这意味着我可以在需要更新时重新安装所有内容。这行得通,但并不完美。
解决方法
在the official documentation中管理Conda环境(也需要PyPI来源或<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.49</version>
<type>jar</type>
<scope>compile</scope>
<optional>true</optional>
</dependency>
安装的本地程序包)的建议是,在YAML文件中定义所有依赖项(Conda和Pip)。像这样:
env.yaml
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
)。创建新的环境时,它应自动提取最新的一致软件包。另外,如果在开发生命周期中需要进行回归,则可以保留先前的env实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。