在MacOS上使用conda和yml文件创建环境时出现“ResolvePackageNotFound”错误

69

我希望使用conda和yml文件创建一个虚拟环境。

命令:

conda env create -n ex3 -f env.yml

输入 ENTER,会出现以下信息:

ResolvePackageNotFound:

 - gst-plugins-base==1.8.0=0
 - dbus==1.10.20=0
 - opencv3==3.2.0=np111py35_0
 - qt==5.6.2=5
 - libxcb==1.12=1
 - libgcc==5.2.0=0
 - gstreamer==1.8.0=0

然而,我在我的Mac上有这些文件。我的MacOS版本为High Sierra 10.13.3。

我的env.yml文件看起来像这样:

name: ex3
channels:
- menpo
- defaults
dependencies:
- cairo=1.14.8=0
- certifi=2016.2.28=py35_0
- cycler=0.10.0=py35_0
- dbus=1.10.20=0
- expat=2.1.0=0
- fontconfig=2.12.1=3
- freetype=2.5.5=2
- glib=2.50.2=1
- gst-plugins-base=1.8.0=0
- gstreamer=1.8.0=0
- harfbuzz=0.9.39=2
- hdf5=1.8.17=2
- icu=54.1=0
- jbig=2.1=0
- jpeg=9b=0
- libffi=3.2.1=1
- libgcc=5.2.0=0
- libgfortran=3.0.0=1
- libiconv=1.14=0
- libpng=1.6.30=1
- libtiff=4.0.6=3
- libxcb=1.12=1
- libxml2=2.9.4=0
- matplotlib=2.0.2=np111py35_0
- mkl=2017.0.3=0
- numpy=1.11.3=py35_0
- openssl=1.0.2l=0
- pandas=0.20.1=np111py35_0
- patsy=0.4.1=py35_0
- pcre=8.39=1
- pip=9.0.1=py35_1
- pixman=0.34.0=0
- pyparsing=2.2.0=py35_0
- pyqt=5.6.0=py35_2
- python=3.5.4=0
- python-dateutil=2.6.1=py35_0
- pytz=2017.2=py35_0
- qt=5.6.2=5
- readline=6.2=2
- scipy=0.19.0=np111py35_0
- seaborn=0.8=py35_0
- setuptools=36.4.0=py35_1
- sip=4.18=py35_0
- six=1.10.0=py35_0
- sqlite=3.13.0=0
- statsmodels=0.8.0=np111py35_0
- tk=8.5.18=0
- wheel=0.29.0=py35_0
- xz=5.2.3=0
- zlib=1.2.11=0
- opencv3=3.2.0=np111py35_0
- pip:
  - bleach==1.5.0
  - enum34==1.1.6
  - html5lib==0.9999999
  - markdown==2.6.11
  - protobuf==3.5.1
  - tensorflow==1.4.1
  - tensorflow-tensorboard==0.4.0
  - werkzeug==0.14.1

如何解决这个问题?

嗯...虽然stack overflow提示我提供更多细节,但我认为我已经描述得很清楚了,可悲的是,stack overflow不支持上传附件...


是的,我可以重现这个问题,但不确定原因... - darthbith
也许这个文件只适用于Linux而不是MacOS... - waschbaerYOYO
10个回答

117

我曾经遇到同样的问题,通过谷歌搜索找到了你的问题。

ResolvePackageNotFound 错误描述的是所有还未安装但是需要的软件包。

要解决这个问题,将它们移到 pip 部分中:

name: ex3
channels:
- menpo
- defaults
dependencies:
  - cairo=1.14.8=0
  - ***
  - another dependencies, except not found ones
  - pip:
    - gst-plugins-base==1.8.0                
    - bleach==1.5.0
    - enum34==1.1.6
    - html5lib==0.9999999
    - markdown==2.6.11
    - protobuf==3.5.1
    - tensorflow==1.4.1
    - tensorflow-tensorboard==0.4.0
    - werkzeug==0.14.1
    *** added ***
    - gst-plugins-base==1.8.0
    - dbus==1.10.20
    - opencv3==3.2.0
    - qt==5.6.2
    - libxcb==1.12
    - libgcc==5.2.0
    - gstreamer==1.8.0

29
我也遇到了同样的问题,在两台Ubuntu机器之间。因此,楼主建议这可能与不同的操作系统有关似乎站不住脚。你的解决方案对我有用,但使用本应使我们免于依赖地狱的系统却遇到了这样的问题,有点可惜。 - LCT
2
这真的取决于您的存储库在哪里可用。对于我的依赖项,我通过在默认设置下添加“-conda-forge”作为通道来解决了这个问题。 - user108569
1
如果有人在conda尝试解析新修改的文件时遇到错误,值得注意的是pip子部分需要缩进两个空格(如所示)。我不知道为什么,因为外部依赖项部分只有一个空格缩进就可以正常工作。 - otocan
有人能解释一下为什么在pip下版本号是==,但在上面却是=吗? - PurpleVermont
@otocan 这是因为pip嵌套在dependencies下面,而下面的项目则嵌套在pip下面 :) 缩进是YAML语法用于显示层次结构的方式。 @PurpleVermont 这也是为什么pip部分有两个==的语法 - 这是为了表示“从pip安装此版本”,而上面单个=的语法则是为了表示“检查您是否确切拥有此版本”。 - Serenthia
显示剩余3条评论

30

我遇到了同样的问题,并在GitHub问题中找到了相关信息。 在评论中,@kalefranz使用--no-builds标志和conda env export提供了一个理想的解决方案。

conda env export --no-builds > environment.yml

然而,即使删除构建号码,某些软件包在不同的操作系统上可能仍具有不同的版本号。我认为最好的方法是为不同的操作系统创建不同的env yml文件。

希望这能帮到您。


这个与 @Northern Poet 的回答结合起来有助于解决问题。 Northern Peot的回答存在的问题是对我来说有太多的包需要搜索和移动。运行此答案可以显著减少数量。 - Yupeng Tang
1
创建不同的环境yml文件用于不同的操作系统的命令是什么?假设我是一名在Ubuntu本机工作的开发者,如何同时从我的本地Ubuntu机器上创建三个不同的(Windows、Mac、Ubuntu)要求文件? - Bikash Gyawali

8

tl;dr conda env export --from-history -n你的环境名称 -f environment.yml


conda env export命令可以将依赖项及操作系统的详细信息钉定到确切的版本。例如,在macOS上为Pandas指定版本号,如- pandas=1.0.5=py38h959d312_0 。但是,conda env create无法使用此信息在其他操作系统(例如在Docker中的Linux)上创建相同的环境。

因此,使用conda env export --from-history命令从历史记录中导出没有设定版本号的包以及在创建conda环境后安装的特定软件包。

https://repo2docker.readthedocs.io/en/latest/howto/export_environment.html


我尝试了上面的答案。唯一解决问题的是这个。 - genferreri
最终使用以下命令进行工作:conda env export --no-builds --from-history > environment.yml - C.J. Windisch
这应该是答案。 - Akin Williams

4

4

'ResolvePackageNotFound'错误的另一个原因可能是您需要的软件包版本位于旧版本的存储库中,默认情况下不会搜索。

Anaconda存储库中位置的不同路径可以在以下找到:
https://repo.continuum.io/pkgs/

我的yml文件[NW_BI.yml]如下:

name: NW_BI
channels:
- 'https://repo.continuum.io/pkgs/free' # Remove this line and it fails!!!
- conda-forge
- defaults
dependencies:
- python=2.7.10
- pandas=0.16.2
- pyodbc=3.0.10

使用以下方式创建:

conda env create -f 'path to file'\NW_BI.yml

我想重新创建一个旧的环境!
注意使用: Anaconda3 2019.10 Windows10

1
我遇到了类似的问题,并且成功地解决了。我的问题与pip无关,而是因为导出平台与导入平台不同(参考:nehaljwani在https://github.com/conda/conda/issues/7311中的答案)。
@Shixiang Wang的答案指向了解决方案的一部分。no-build参数允许更灵活的操作,但有些组件是特定于平台或操作系统的。
使用no-build导出,我能够识别出(从导入时的错误消息中)哪些库存在问题,并将它们简单地从YML文件中删除。这可能不是完美的,但比从头开始节省了很多时间。
注意:我遇到了一个Pip子进程错误,它在给定的库处中断了安装,可以通过conda install 来简单地解决。从那里,我可以从YML文件重新启动导入。

0
假设使用以下命令创建环境.yml文件:conda env export --from-history -n envName -f environment1.yml其中envName是我们感兴趣的环境名称。假定文件的内容为:
    name: envName
    channels:
      - defaults
    dependencies:
      - python=3.9
      - numpy
      - spyder
      - scipy
      - opencv==4.5.5
      - scikit-learn-intelex
      - shapely
      - imgaug
      - r-uuid
      - more-itertools
      - sympy
      - pylatex
      - progressbar2
    prefix: /home/User/anaconda3/envs/envName

然后在 channels 中的 - defaults 下添加 - conda-forge,然后尝试重新创建环境。



0
你可以使用"conda env export --from-history > environment.yml"命令,这将只包括conda的跨平台依赖项。
要包括pip依赖项,请使用"conda env export > temp.yml"命令,并将pip相关的依赖项复制到上述文件中。
现在删除temp.yml文件,并使用"conda env create -f environment.yml"命令创建环境。

0
如果您正在查看此内容并感到更改Conda版本packge=ver=py.*为pip样式package==ver太麻烦,我编写了这个小脚本,可以从Conda样式中删除=py.*部分。
请注意,下面的代码适用于您已经将package=ver更改为package==ver的前提下。
#!/bin/bash

COUNT=0
find_pip=0

while IFS= read -r line; do
    COUNT=$(( $COUNT + 1 ))
#    echo "$COUNT"
#    echo "read it"
    if echo ${line} | grep -q -- "- pip:" ; then
#        echo "find it"
        find_pip=1
        indent=`awk -F- '{print length($1)}' <<< "$line"`
        pip_indent=$(( $indent + 2 ))
#        echo $indent
#    echo $pip_indent
    fi

    line_indent=`awk -F- '{print length($1)}' <<< "$line"`

    if [[ ${find_pip} ]] && [[ ${pip_indent} -eq ${line_indent} ]]; then
#        echo "$line"
        new_line=`echo ${line} | cut -d'=' -f-3`
        new_line="    $new_line"
#        echo "${new_line}"
        sed -e "${COUNT}s/.*/${new_line}/" -i '' $1
    fi
done < "$1"

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