管理conda和pip之间的依赖关系的最佳做法

时间:2020-08-12 16:35:21

标签: python pip conda

我正在开发一个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软件包,因此初始安装是一致的,这意味着我可以在需要更新时重新安装所有内容。这行得通,但并不完美。

1 个答案:

答案 0 :(得分:0)

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实例。