conda是否使用pip install从pypi更新软件包?

时间:2017-05-30 14:52:35

标签: python pip anaconda pypi

我使用Anaconda(因为它很棒),而conda install提供的包是quite extensive。但是,我现在需要安装一个在conda存储库中不可用的软件包,所以从pypi获取它。

我的问题:当我运行命令conda update --all时,conda还会更新这些pypi包吗?或者我是否必须单独更新它们? conda docs似乎没有回答这个问题。 This question and answer似乎表明不,conda不管理pypi包,但我仍然不确定。

3 个答案:

答案 0 :(得分:6)

不,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

使用six(旧版本)安装pip

(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)?

答案 1 :(得分:1)

Conda 4.6具有实验性功能,可与pip安装的软件包实现互操作性。使用conda config --set pip_interop_enabled true。可以通过conda进行“管理”(即删除)的未安装conda的python软件包,以满足当前的解决方案。可管理的软件包通常是通过轮子安装的。安装了较新版本的pip的Sdists通常也是可管理的。但是,如果版本相同,则conda不会将未安装conda的软件包切换为conda软件包。

无法管理的非conda安装的python软件包会将环境锚定在适当的位置,直到通过其他方法将其删除为止。难以管理的软件包的一个示例是使用pip install -e的“可编辑”安装。

所有这些都适用于conda update --all

答案 2 :(得分:1)

这个问题很旧,但这是一个批处理脚本,可能有助于在 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