在conda环境yml中声明pip依赖是否安全

Is it safe to declare pip dependencies in a conda environment yml

根据 this blog post from Anaconda,同时使用 pip 和 conda 的包是不安全的。

Unfortunately, issues can arise when conda and pip are used together to create an environment [...] One surefire method is to only use conda packages.

然而,conda 引入了一项功能,可以在环境 YAML 文件中指定 pip 依赖项。

使用此功能安全吗?它会导致破坏环境吗?应该怎么做才能确保这种情况不会发生?

我认为说结合使用它们不安全是不公平的,人们总是这样做。只是你必须要小心。博客 post 有点过时(我认为需要更新)但一些重要的细节没有改变。只要您从 conda 环境文件安装和更新,并且尽可能通过 conda 而不是 pip 安装软件包,您应该没问题。或者至少这是我一年来在多个项目中所做的事情。我 运行 遇到的安装问题总是由于生态系统中的其他问题,而不是 conda 环境文件的 pip: 特性。

Is this feature safe to use?

是的。我敢肯定有办法搞砸它,我不太确定你在这里是如何定义“安全”的,但是像下面这样的配置在生产中很常用。

name: my-dev-env
channels:
  - conda-forge
dependencies:
  - python
  - ...
  - some_other_conda_package
  - pip:
    - some_pypi_package

这或多或少做了没有 pip: 部分的事情,但是调用 pip 并结束安装 some_pypi_package

Can it lead to broken environments?

是的,但您必须尝试这样做。这个位

Most of these issues stem from that fact that conda, like other package managers, has limited abilities to control packages it did not install. Running conda after pip has the potential to overwrite and potentially break packages installed via pip. Similarly, pip may upgrade or remove a package which a conda-installed package requires. In some cases these breakages are cosmetic, where a few files are present that should have been removed, but in other cases the environment may evolve into an unusable state.

仍然成立,如果 设置环境后, conda install xyzpip install xyz 可以互换且随意调用,则往往会发生这种情况。这与您的环境 YAML 中的 pip: 部分不同,而且危险得多。

What should one do to ensure this doesn't happen?

一般来说,如果您需要从 PyPI 中提取一些东西,但又要在您的 conda 环境中对其进行安全管理:

  • 避免手动 conda installpip install 调用。相反,从您的环境文件更新,即 conda env update --file env.yaml。这将以(相对)安全的方式从 PyPI 更新您的 conda 包和 re-install 任何您需要的东西。事实上,您询问通过 pip 从 conda 环境文件安装意味着您已经在正确的轨道上。
  • 如果某些东西只能在 PyPI 上可用或出于其他原因只能通过 pip 安装,则只能从 pip 安装。例如,我使用它的 git+ 功能在制作 conda 包之前安装开发版本 - 尽管我不建议这样做。
  • 尝试将一些包移动到 conda - 博客 post 多次提到这一点。 conda-forge 也特别尝试 make this easy.