conda:如果我们设置 pip_interop_enabled=True 会有什么区别?

Mik*_*lia 4 python pip pypi anaconda conda

该网站上有许多帖子通常顺便提及pip_interop_enabled=True在某些环境中进行设置的想法。据我所知,这使得 conda 和 pip3 在某种程度上可以更好地交互。准确地说,如果这是真的,人们说 conda 将在 PyPI 中搜索主通道中不存在的包。他们还说这是“实验性的”。

这是conda关于此的文档。它指出,即使使用 pip_interop_enabled=False,最近版本中 conda 的大部分行为也得到了改进,导致人们质疑此设置的作用。

我的问题是:实际上,这一切意味着什么?

  • 如果这是 True 则 conda 将搜索 PyPI,如果这是 False,则 conda 将搜索 PyPI 的唯一区别是什么?
  • 它还有其他作用吗?例如,如果我需要从 pip 安装一些包,如果此设置为 True,conda 是否会更好地知道不要破坏它?
  • 准确地说,如果我将其设置为 True,会出现什么问题?如果此“实验”设置设置为 True,是否存在已知的边缘情况会以某种方式破坏事物?
  • 为什么我不想设置这个?

mer*_*erv 7

不是 PyPI 搜索功能

首先,让我们澄清一下:Conda 不会“搜索 PyPI ”——这不是pip_interop_enabled配置选项添加的内容。相反,它使求解器能够允许已安装的包pip满足 Conda 包的依赖关系要求。请注意,该选项与Pip互操作性有关(与 PyPI 不同),并且包是否来自 PyPI、GitHub、本地等并不重要。

例子:scipy -> numpy

让我们考虑一个简单的示例来说明该行为。从具有 Python 3.10 并从 PyPI 安装的以下环境开始numpy

pip_interop.yaml

name: pip_interop
channels:
  - conda-forge
dependencies:
  - python=3.10
  - pip

  ## PyPI packages
  - pip:
    - numpy
Run Code Online (Sandbox Code Playgroud)

我们可以用它来创建

conda env create -n pip_interop -f pip_interop.yaml
Run Code Online (Sandbox Code Playgroud)

并验证是否numpy来自 PyPI:

$ conda list -n pip_interop numpy
# packages in environment at /Users/user/mambaforge/envs/pip_interop:
#
# Name                    Version                   Build  Channel
numpy                     1.24.2                   pypi_0  
Run Code Online (Sandbox Code Playgroud)

让我们看看安装时会发生什么scipy,特别是它如何满足其numpy依赖性。

在没有 Pip 互操作性的情况下安装

在默认模式下,我们会看到以下行为

$ conda install -n pip_interop scipy
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /Users/user/mambaforge/envs/pip_interop

  added / updated specs:
    - scipy


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    cryptography-39.0.1        |  py310hdd0c95c_0         1.1 MB
    numpy-1.24.2               |  py310h788a5b3_0         6.1 MB
    scipy-1.10.0               |  py310h240c617_2        20.2 MB
    ------------------------------------------------------------
                                           Total:        27.4 MB

The following NEW packages will be INSTALLED:

  appdirs            conda-forge/noarch::appdirs-1.4.4-pyh9f0ad1d_0 
  brotlipy           conda-forge/osx-64::brotlipy-0.7.0-py310h90acd4f_1005 
  certifi            conda-forge/noarch::certifi-2022.12.7-pyhd8ed1ab_0 
  cffi               conda-forge/osx-64::cffi-1.15.1-py310ha78151a_3 
  charset-normalizer conda-forge/noarch::charset-normalizer-2.1.1-pyhd8ed1ab_0 
  cryptography       conda-forge/osx-64::cryptography-39.0.1-py310hdd0c95c_0 
  idna               conda-forge/noarch::idna-3.4-pyhd8ed1ab_0 
  libblas            conda-forge/osx-64::libblas-3.9.0-16_osx64_openblas 
  libcblas           conda-forge/osx-64::libcblas-3.9.0-16_osx64_openblas 
  libcxx             conda-forge/osx-64::libcxx-14.0.6-hccf4f1f_0 
  libgfortran        conda-forge/osx-64::libgfortran-5.0.0-11_3_0_h97931a8_27 
  libgfortran5       conda-forge/osx-64::libgfortran5-11.3.0-h082f757_27 
  liblapack          conda-forge/osx-64::liblapack-3.9.0-16_osx64_openblas 
  libopenblas        conda-forge/osx-64::libopenblas-0.3.21-openmp_h429af6e_3 
  llvm-openmp        conda-forge/osx-64::llvm-openmp-15.0.7-h61d9ccf_0 
  numpy              conda-forge/osx-64::numpy-1.24.2-py310h788a5b3_0 
  packaging          conda-forge/noarch::packaging-23.0-pyhd8ed1ab_0 
  pooch              conda-forge/noarch::pooch-1.6.0-pyhd8ed1ab_0 
  pycparser          conda-forge/noarch::pycparser-2.21-pyhd8ed1ab_0 
  pyopenssl          conda-forge/noarch::pyopenssl-23.0.0-pyhd8ed1ab_0 
  pysocks            conda-forge/noarch::pysocks-1.7.1-pyha2e5f31_6 
  python_abi         conda-forge/osx-64::python_abi-3.10-3_cp310 
  requests           conda-forge/noarch::requests-2.28.2-pyhd8ed1ab_0 
  scipy              conda-forge/osx-64::scipy-1.10.0-py310h240c617_2 
  urllib3            conda-forge/noarch::urllib3-1.26.14-pyhd8ed1ab_0 

Proceed ([y]/n)?
Run Code Online (Sandbox Code Playgroud)

请注意,尽管numpy已经安装在环境中,Conda 还是建议将其替换为 Conda 版本。也就是说,只考虑其中的信息conda-meta/来确定软件包是否已安装,而不会检查环境的lib/python3.10/site-packages/.

使用 Pip 互操作性进行安装

现在我们在打开的情况下尝试一下pip_interop_enabled

$ CONDA_PIP_INTEROP_ENABLED=1 conda install -n foo scipy
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /Users/user/mambaforge/envs/pip_interop

  added / updated specs:
    - scipy


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    cryptography-39.0.1        |  py310hdd0c95c_0         1.1 MB
    scipy-1.10.0               |  py310h240c617_2        20.2 MB
    ------------------------------------------------------------
                                           Total:        21.3 MB

The following NEW packages will be INSTALLED:

  appdirs            conda-forge/noarch::appdirs-1.4.4-pyh9f0ad1d_0 
  brotlipy           conda-forge/osx-64::brotlipy-0.7.0-py310h90acd4f_1005 
  certifi            conda-forge/noarch::certifi-2022.12.7-pyhd8ed1ab_0 
  cffi               conda-forge/osx-64::cffi-1.15.1-py310ha78151a_3 
  charset-normalizer conda-forge/noarch::charset-normalizer-2.1.1-pyhd8ed1ab_0 
  cryptography       conda-forge/osx-64::cryptography-39.0.1-py310hdd0c95c_0 
  idna               conda-forge/noarch::idna-3.4-pyhd8ed1ab_0 
  libblas            conda-forge/osx-64::libblas-3.9.0-16_osx64_openblas 
  libcblas           conda-forge/osx-64::libcblas-3.9.0-16_osx64_openblas 
  libcxx             conda-forge/osx-64::libcxx-14.0.6-hccf4f1f_0 
  libgfortran        conda-forge/osx-64::libgfortran-5.0.0-11_3_0_h97931a8_27 
  libgfortran5       conda-forge/osx-64::libgfortran5-11.3.0-h082f757_27 
  liblapack          conda-forge/osx-64::liblapack-3.9.0-16_osx64_openblas 
  libopenblas        conda-forge/osx-64::libopenblas-0.3.21-openmp_h429af6e_3 
  llvm-openmp        conda-forge/osx-64::llvm-openmp-15.0.7-h61d9ccf_0 
  packaging          conda-forge/noarch::packaging-23.0-pyhd8ed1ab_0 
  pooch              conda-forge/noarch::pooch-1.6.0-pyhd8ed1ab_0 
  pycparser          conda-forge/noarch::pycparser-2.21-pyhd8ed1ab_0 
  pyopenssl          conda-forge/noarch::pyopenssl-23.0.0-pyhd8ed1ab_0 
  pysocks            conda-forge/noarch::pysocks-1.7.1-pyha2e5f31_6 
  python_abi         conda-forge/osx-64::python_abi-3.10-3_cp310 
  requests           conda-forge/noarch::requests-2.28.2-pyhd8ed1ab_0 
  scipy              conda-forge/osx-64::scipy-1.10.0-py310h240c617_2 
  urllib3            conda-forge/noarch::urllib3-1.26.14-pyhd8ed1ab_0 


Proceed ([y]/n)?
Run Code Online (Sandbox Code Playgroud)

请注意,现在numpy不建议替换,这是因为现有pip安装的版本被认为能够满足依赖性。

为什么这是实验性的?

可能有多种原因导致该技术在几年后仍处于实验阶段。一个重要原因是 Conda 仅针对依赖项的 Conda 构建来测试其包构建。因此,它不能保证包在功能上是可互换的。

此外,Conda 包通常会引入非 Python 依赖项。轮部署有所增加,这是 PyPI 的方法,但并不普遍。仍然有许多“包装器”软件包,其中 PyPI 版本假设某些二进制文件位于 PATH 上,而 Conda 软件包的安装保证也安装了二进制文件。

另一个重要问题是 PyPI-Conda 名称映射定义不明确。也就是说,PyPI 中的包名称可能与其 Conda 包名称不对应。当名称不同时,这可能会直接导致神秘的问题。pip具体来说,当名称不匹配时,Conda 将无法正确识别已安装的软件包是否满足要求。因此,互操作性的应用方式存在一些意想不到的异质性。

示例:torchpytorch

在Python生态系统中,该torch模块由PyPI包提供torch。然而,PyPI 中的包在 Conda 通道上torch运行。pytorch

以下是这如何导致不一致的行为。让我们从 PyPI 安装开始torch

pip_interop.yaml

name: pip_interop
channels:
  - conda-forge
dependencies:
  - python=3.10
  - pip

  ## PyPI packages
  - pip:
    - torch
Run Code Online (Sandbox Code Playgroud)

创建:

conda env create -n pip_interop -f pip_interop.yaml
Run Code Online (Sandbox Code Playgroud)

现在,如果我们torchvision从 Conda 安装,即使打开了pip_interop_enabled,我们也会得到:

$ CONDA_PIP_INTEROP_ENABLED=1 conda install -n pip_interop torchvision
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /Users/user/mambaforge/envs/pip_interop

  added / updated specs:
    - torchvision


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    cryptography-39.0.1        |  py310hdd0c95c_0         1.1 MB
    jpeg-9e                    |       hb7f2c08_3         226 KB
    libprotobuf-3.21.12        |       hbc0c0cd_0         1.8 MB
    mkl-2022.2.1               |   h44ed08c_16952       113.1 MB
    numpy-1.24.2               |  py310h788a5b3_0         6.1 MB
    pillow-9.4.0               |  py310h306a057_1        44.1 MB
    pytorch-1.13.1             |cpu_py310h2bbf33f_1        56.9 MB
    sleef-3.5.1                |       h6db0672_2         1.0 MB
    torchvision-0.14.1         |cpu_py310hd5ee960_0         5.9 MB
    ------------------------------------------------------------
                                           Total:       230.1 MB

The following NEW packages will be INSTALLED:

  brotlipy           conda-forge/osx-64::brotlipy-0.7.0-py310h90acd4f_1005 
  certifi            conda-forge/noarch::certifi-2022.12.7-pyhd8ed1ab_0 
  cffi               conda-forge/osx-64::cffi-1.15.1-py310ha78151a_3 
  charset-normalizer conda-forge/noarch::charset-normalizer-2.1.1-pyhd8ed1ab_0 
  cryptography       conda-forge/osx-64::cryptography-39.0.1-py310hdd0c95c_0 
  freetype           conda-forge/osx-64::freetype-2.12.1-h3f81eb7_1 
  idna               conda-forge/noarch::idna-3.4-pyhd8ed1ab_0 
  jpeg               conda-forge/osx-64::jpeg-9e-hb7f2c08_3 
  lcms2              conda-forge/osx-64::lcms2-2.14-h29502cd_1 
  lerc               conda-forge/osx-64::lerc-4.0.0-hb486fe8_0 
  libblas            conda-forge/osx-64::libblas-3.9.0-16_osx64_openblas 
  libcblas           conda-forge/osx-64::libcblas-3.9.0-16_osx64_openblas 
  libcxx             conda-forge/osx-64::libcxx-14.0.6-hccf4f1f_0 
  libdeflate         conda-forge/osx-64::libdeflate-1.17-hac1461d_0 
  libgfortran        conda-forge/osx-64::libgfortran-5.0.0-11_3_0_h97931a8_27 
  libgfortran5       conda-forge/osx-64::libgfortran5-11.3.0-h082f757_27 
  liblapack          conda-forge/osx-64::liblapack-3.9.0-16_osx64_openblas 
  libopenblas        conda-forge/osx-64::libopenblas-0.3.21-openmp_h429af6e_3 
  libpng             conda-forge/osx-64::libpng-1.6.39-ha978bb4_0 
  libprotobuf        conda-forge/osx-64::libprotobuf-3.21.12-hbc0c0cd_0 
  libtiff            conda-forge/osx-64::libtiff-4.5.0-hee9004a_2 
  libwebp-base       conda-forge/osx-64::libwebp-base-1.2.4-h775f41a_0 
  libxcb             conda-forge/osx-64::libxcb-1.13-h0d85af4_1004 
  llvm-openmp        conda-forge/osx-64::llvm-openmp-15.0.7-h61d9ccf_0 
  mkl                conda-forge/osx-64::mkl-2022.2.1-h44ed08c_16952 
  numpy              conda-forge/osx-64::numpy-1.24.2-py310h788a5b3_0 
  openjpeg           conda-forge/osx-64::openjpeg-2.5.0-h13ac156_2 
  pillow             conda-forge/osx-64::pillow-9.4.0-py310h306a057_1 
  pthread-stubs      conda-forge/osx-64::pthread-stubs-0.4-hc929b4f_1001 
  pycparser          conda-forge/noarch::pycparser-2.21-pyhd8ed1ab_0 
  pyopenssl          conda-forge/noarch::pyopenssl-23.0.0-pyhd8ed1ab_0 
  pysocks            conda-forge/noarch::pysocks-1.7.1-pyha2e5f31_6 
  python_abi         conda-forge/osx-64::python_abi-3.10-3_cp310 
  pytorch            conda-forge/osx-64::pytorch-1.13.1-cpu_py310h2bbf33f_1 
  requests           conda-forge/noarch::requests-2.28.2-pyhd8ed1ab_0 
  sleef              conda-forge/osx-64::sleef-3.5.1-h6db0672_2 
  tbb                conda-forge/osx-64::tbb-2021.7.0-hb8565cd_1 
  torchvision        conda-forge/osx-64::torchvision-0.14.1-cpu_py310hd5ee960_0 
  typing_extensions  conda-forge/noarch::typing_extensions-4.4.0-pyha770c72_0 
  urllib3            conda-forge/noarch::urllib3-1.26.14-pyhd8ed1ab_0 
  xorg-libxau        conda-forge/osx-64::xorg-libxau-1.0.9-h35c211d_0 
  xorg-libxdmcp      conda-forge/osx-64::xorg-libxdmcp-1.1.3-h35c211d_0 
  zstd               conda-forge/osx-64::zstd-1.5.2-hbc0c0cd_6 


Proceed ([y]/n)?
Run Code Online (Sandbox Code Playgroud)

也就是说,Conda 仍然尝试安装pytorch,这意味着它将导致从 PyPI 安装的现有包被破坏torch。这有可能将损坏版本的包中的残留文件与损坏版本混合在一起。

基本上,这是未定义的行为,Conda 软件可能不会向您提供有关潜在问题的任何警告。