繁体   English   中英

conda 是否从使用 pip install 安装的 pypi 更新包?

[英]Does conda update packages from pypi installed using pip install?

我使用Anaconda (因为它很棒),并且通过conda install提供的软件包非常广泛 但是,有时我确实需要安装一个在 conda 存储库中不可用的软件包,因此可以从 pypi获取它。

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

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

这个问题很老,但这里有一个批处理脚本可能有助于在Windows上自动化这个过程。 它涉及通过conda list并查找标有pypi标签的包,然后使用pip --upgrade en masse 对其进行升级(假设它们已过时;否则标准的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM