conda更新使用pip install安装的pypi软件包吗?

13

我使用Anaconda(因为它很棒),通过conda install命令可用的软件包相当丰富。但有时需要安装不在conda存储库中的软件包,因此需要从pypi获取

我的问题是:当我运行命令conda update --all时,conda是否还会更新这些pypi软件包?还是我必须单独更新它们?conda文档似乎没有回答这个问题。这个问题和回答似乎表明,conda不管理pypi软件包,但我仍然不确定。

3个回答

12

不,conda updateconda install 不会更新使用 pip 安装的软件包,也不会使用 pip 安装它们。

这些 conda 命令只会检查您的“默认”anaconda-channels或使用 -c 指定的那些频道,并忽略其他所有内容。唯一的例外是 conda list,它还显示使用 pip 安装的软件包,这些软件包带有 <pip> 标记,并且不会被更新。

一个使用 pipsix 的示例:

$ conda create -n testenv python=3.5
Fetching package metadata .................
Solving package specifications: .

Package plan for installation in environment testenv:

The following NEW packages will be INSTALLED:

    pip:            9.0.1-py35_1
    python:         3.5.3-3
    setuptools:     27.2.0-py35_1
    vs2015_runtime: 14.0.25123-0
    wheel:          0.29.0-py35_0

Proceed ([y]/n)? y

$ activate testenv

使用pip(旧版本)安装six:

(testenv) $ pip install six==1.6
Collecting six==1.6
  Downloading six-1.6.0-py2.py3-none-any.whl
Installing collected packages: six
Successfully installed six-1.6.0

conda update不能更新它(请注意,six未在“所有请求的软件包”列表中列出,但它在conda list中列出):

(testenv) $ conda update --all
Fetching package metadata .................
Solving package specifications: .

# All requested packages already installed.
# packages in environment at testenv:
#
pip                       9.0.1                    py35_1
python                    3.5.3                         3
setuptools                27.2.0                   py35_1
vs2015_runtime            14.0.25123                    0
wheel                     0.29.0                   py35_0

(testenv) $ conda list
# packages in environment at testenv:
#
pip                       9.0.1                    py35_1
python                    3.5.3                         3
setuptools                27.2.0                   py35_1
six                       1.6.0                     <pip>
vs2015_runtime            14.0.25123                    0
wheel                     0.29.0                   py35_0

但是它可以通过 pip 进行升级:

(testenv) $ pip install six --upgrade
Collecting six
  Using cached six-1.10.0-py2.py3-none-any.whl
Installing collected packages: six
  Found existing installation: six 1.6.0
    Uninstalling six-1.6.0:
      Successfully uninstalled six-1.6.0
Successfully installed six-1.10.0

仅仅是为了展示在anaconda渠道中有一个更新的six版本(当我执行conda update时被忽略了):

(testenv) $ conda install six
Fetching package metadata .................
Solving package specifications: .

Package plan for installation in environment testenv:

The following NEW packages will be INSTALLED:

    six: 1.10.0-py35_0

Proceed ([y]/n)?

conda create --clone 命令是否也不会克隆 pip 包? - user3731622
好问题。 - Soerendip

8
Conda 4.6有一个实验性的功能,可以与pip安装的软件包进行互操作。使用conda config --set pip_interop_enabled true。可以更新/更改可由conda“管理”(即删除)的非conda安装的Python软件包以满足当前解决方案。可管理的软件包通常是从wheels安装的。使用较新版本的pip安装的sdist也通常是可管理的。但是,如果版本相同,则conda不会将非conda安装的软件包替换为conda软件包。
无法管理的非conda安装的Python软件包将使环境固定在原地,直到通过其他方式将其删除。无法管理的软件包示例是使用pip install -e进行的“可编辑”安装。
所有这些都适用于conda update --all

2
这个问题早已存在,但这里有一份批处理脚本可以帮助自动化这个在Windows上的过程。它涉及通过conda list查找标记为pypi的软件包,然后使用pip --upgrade进行批量升级(假设它们已过期;否则将返回标准的Requirement already up-to-date消息)。
将以下内容放入批处理文件中(例如,condapip.bat),并尝试运行:
@echo off

set packages=pip install --upgrade
for /f "tokens=1" %%i in ('conda list ^| findstr /R /C:"pypi"') do (call :join %%i)
@echo on
%packages%
@echo off
goto :eof

:join
set packages=%packages% %1
goto :eof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接