创建 conda 环境:“发现冲突!”当解决环境和“寻找最短冲突路径”永远运行时
Posted
技术标签:
【中文标题】创建 conda 环境:“发现冲突!”当解决环境和“寻找最短冲突路径”永远运行时【英文标题】:Create conda environment: "Found conflicts!" when solving environment and "Finding shortest conflict path" running forever 【发布时间】:2020-02-01 15:24:45 【问题描述】:我获得了一个environment.ubuntu.yml
文件,以便能够创建一个 conda 环境。但是,运行 conda create env --file environment.ubuntu.yml
我得到以下输出:
conda env create --file environment.ubuntu.yml
Collecting package metadata (repodata.json): done
Solving environment: -
Found conflicts! Looking for incompatible packages.
This can take several minutes. Press CTRL-C to abort.
Examining fontconfig: 5%|▉ | 10/202 [00:00<00:00, 5393.91it/ ]
Comparing specs that have this dependency: 0%| | 0/12 [00:00<?, ?it/s]
Finding shortest confli| path for fontconfig==2.13.1=he4413a7_1000: 12%|▏| 1/8
Finding shortest conflict path for fontconfig==2.13.1=he4413a7_1000: 25%|▎| 2/8
Finding shortest conflict pa/ for fontconfig[version='>=2.13.0,<3.0a0']: 25%|
Finding shortest conflict path for fontconfig[version='>=2.13.0,<3.0a0']: 38%|
Finding shortest conf- ct path for fontconfig[version='>=2.11.1']: 38%|▍| 3/8 [
Finding shortest conflict path for fontconfig[version='>=2.11.1']: 50%|▌| 4/8 [
Finding shortest conflict pa| for fontconfig[version='>=2.12.4,<3.0a0']: 50%|
...
Finding shortest conflict path
持续了很长时间 - 显然它正在尝试解决一些依赖问题。运行了 2 个小时,它是否会停止尚不清楚。
我的问题是:这里发生了什么,我可以以某种方式手动加速这个过程,例如通过删除不必要的依赖项?由于我没有创建环境,我不知道哪些是真正必要的。
我之所以好奇是因为它正在检查fontconfig[version='>=2.12.6,<3.0a0']
之类的冲突路径,而dependencies
中的路径是2.13.1
,我已经通过2.13.1
安装了它
请在下面找到 .yml 文件以供参考。
name: cea
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- dlr-sc
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- conda-forge
- conda-forge/label/gcc7
- defaults
dependencies:
- attrs=19.1.0=py_0
- backports=1.0=py_2
- backports.functools_lru_cache=1.5=py_1
- backports_abc=0.5=py_1
- boost-cpp=1.68.0=h11c811c_1000
- bzip2=1.0.6=h14c3975_1002
- ca-certificates=2019.3.9=hecc5488_0
- cairo=1.14.12=h80bd089_1005
- certifi=2019.3.9=py27_0
- click=7.0=py_0
- click-plugins=1.0.4=py_0
- cligj=0.5.0=py_0
- curl=7.64.1=hf8cf82a_0
- cycler=0.10.0=py_1
- descartes=1.1.0=py_2
- enum34=1.1.6=py27_1001
- expat=2.2.5=hf484d3e_1002
- fiona=1.8.6=py27hf242f0b_2
- fontconfig=2.13.1=he4413a7_1000
- freetype=2.10.0=he983fc9_0
- freexl=1.0.5=h14c3975_1002
- functools32=3.2.3.2=py_3
- futures=3.2.0=py27_1000
- gdal=2.4.1=py27h5f563d9_8
- geopandas=0.4.1=py_1
- geos=3.7.1=hf484d3e_1000
- geotiff=1.4.3=h1105359_1000
- gettext=0.19.8.1=hc5be6a0_1002
- giflib=5.1.7=h516909a_1
- glib=2.56.2=had28632_1001
- hdf4=4.2.13=h9a582f1_1002
- hdf5=1.10.4=nompi_h3c11f04_1106
- icu=58.2=hf484d3e_1000
- jpeg=9c=h14c3975_1001
- json-c=0.13.1=h14c3975_1001
- kealib=1.4.10=h1978553_1003
- kiwisolver=1.0.1=py27h6bb024c_1002
- krb5=1.16.3=h05b26f9_1001
- libblas=3.8.0=4_openblas
- libcblas=3.8.0=4_openblas
- libcurl=7.64.1=hda55be3_0
- libdap4=3.19.1=hd48c02d_1000
- libedit=3.1.20170329=hf8c457e_1001
- libffi=3.2.1=he1b5a44_1006
- libgdal=2.4.1=heae24aa_8
- libiconv=1.15=h516909a_1005
- libkml=1.3.0=h328b03d_1009
- liblapack=3.8.0=4_openblas
- libnetcdf=4.6.2=hbdf4f91_1001
- libpng=1.6.36=h84994c4_1000
- libpq=11.2=h4770945_0
- libspatialindex=1.9.0=he1b5a44_0
- libspatialite=4.3.0a=hb5ec416_1026
- libssh2=1.8.2=h22169c7_2
- libtiff=4.0.10=h648cc4a_1001
- libuuid=2.32.1=h14c3975_1000
- libxcb=1.13=h14c3975_1002
- libxml2=2.9.8=h143f9aa_1005
- mapclassify=1.0.1=py27_1
- matplotlib=2.2.3=py27h8a2030e_1
- matplotlib-base=2.2.3=py27h60b886d_1
- munch=2.3.2=py_0
- ncurses=6.1=hf484d3e_1002
- numpy=1.16.2=py27h8b7e671_1
- openblas=0.3.5=h9ac9557_1001
- openjpeg=2.3.0=hf38bd82_1003
- openssl=1.1.1b=h14c3975_1
- pandas=0.24.2=py27hf484d3e_0
- pip=19.0.3=py27_0
- pixman=0.34.0=h14c3975_1003
- poppler=0.67.0=h2fc8fa2_1002
- poppler-data=0.4.9=1
- postgresql=11.2=h61314c7_0
- proj4=5.2.0=h14c3975_1001
- pthread-stubs=0.4=h14c3975_1001
- pyparsing=2.3.1=py_0
- pyproj=1.9.6=py27hc0953d3_1000
- pyqt=5.6.0=py27h13b7fb3_1008
- python=2.7.15=h721da81_1008
- python-dateutil=2.8.0=py_0
- pytz=2018.9=py_0
- readline=7.0=hf8c457e_1001
- rtree=0.8.3=py27h666c49c_1002
- scipy=1.2.1=py27h09a28d5_1
- setuptools=40.8.0=py27_0
- shapely=1.6.4=py27h2afed24_1003
- singledispatch=3.4.0.3=py27_1000
- sip=4.18.1=py27hf484d3e_1000
- six=1.12.0=py27_1000
- sqlite=3.26.0=h67949de_1001
- subprocess32=3.5.3=py27h14c3975_0
- tbb=2019.5=hc9558a2_0
- tk=8.6.9=h84994c4_1001
- tornado=5.1.1=py27h14c3975_1000
- tzcode=2018g=h14c3975_1001
- wheel=0.33.1=py27_0
- xerces-c=3.2.2=hac72e42_1001
- xorg-kbproto=1.0.7=h14c3975_1002
- xorg-libice=1.0.9=h516909a_1004
- xorg-libsm=1.2.3=h84519dc_1000
- xorg-libx11=1.6.7=h14c3975_1000
- xorg-libxau=1.0.9=h14c3975_0
- xorg-libxdmcp=1.1.3=h516909a_0
- xorg-libxext=1.3.4=h516909a_0
- xorg-libxrender=0.9.10=h516909a_1002
- xorg-renderproto=0.11.1=h14c3975_1002
- xorg-xextproto=7.3.0=h14c3975_1002
- xorg-xproto=7.0.31=h14c3975_1007
- xz=5.2.4=h14c3975_1001
- zlib=1.2.11=h14c3975_1004
- freeimageplus=3.18.0=hf484d3e_2
- gl2ps=1.3.8=h14c3975_4
- oce=0.17.2=h6bb024c_10
- pythonocc-core=0.17=py27_1
- mkl=2017.0.3=0
- mkl-service=1.1.2=py27_3
- dbus=1.13.2=h714fa37_1
- gst-plugins-base=1.14.0=hbbd80ab_1
- gstreamer=1.14.0=hb453b48_1
- libgcc-ng=8.2.0=hdf63c60_1
- libgfortran-ng=7.3.0=hdf63c60_0
- libstdcxx-ng=8.2.0=hdf63c60_1
- pcre=8.43=he6710b0_0
- qt=5.6.3=h8bf5577_3
- pip:
- alabaster==0.7.12
- babel==2.6.0
- backports.shutil-get-terminal-size==1.0.0
- bleach==3.1.0
- chardet==3.0.4
- cloudpickle==0.8.1
- configparser==3.7.4
- cvxopt==1.2.3
- decorator==4.4.0
- defusedxml==0.5.0
- docutils==0.14
- doit==0.29.0
- entrypoints==0.3
- ephem==3.7.6.0
- funcsigs==1.0.2
- h5py==2.9.0
- idna==2.8
- imagesize==1.1.0
- importlib-resources==1.0.2
- ipaddress==1.0.22
- ipykernel==4.10.0
- ipython==5.8.0
- ipython-genutils==0.2.0
- ipywidgets==7.4.2
- jinja2==2.10
- joblib==0.12.5
- jsonschema==3.0.1
- jupyter==1.0.0
- jupyter-client==5.2.4
- jupyter-console==5.2.0
- jupyter-core==4.4.0
- llvmlite==0.28.0
- lxml==4.3.3
- markupsafe==1.1.1
- mistune==0.8.4
- mock==2.0.0
- nbconvert==5.4.1
- nbformat==4.4.0
- networkx==2.2
- notebook==5.7.8
- numba==0.43.1
- packaging==19.0
- pandocfilters==1.4.2
- pathlib2==2.3.3
- patsy==0.5.1
- pbr==5.1.3
- pexpect==4.6.0
- pickleshare==0.7.5
- pkginfo==1.5.0.1
- plotly==3.7.1
- prometheus-client==0.6.0
- prompt-toolkit==1.0.15
- ptyprocess==0.6.0
- py4design==0.27
- pycollada==0.6
- pygments==2.3.1
- pyinotify==0.9.6
- pymc3==3.6
- pymf==0.1.9
- pyrsistent==0.14.11
- pysal==1.14.4.post2
- pyshp==2.1.0
- pyyaml==5.1
- pyzmq==18.0.1
- qtconsole==4.4.3
- readme-renderer==24.0
- requests==2.21.0
- requests-toolbelt==0.9.1
- retrying==1.3.3
- salib==1.2
- scandir==1.10.0
- scikit-learn==0.20.3
- seaborn==0.9.0
- send2trash==1.5.0
- simplegeneric==0.8.1
- snowballstemmer==1.2.1
- sphinx==1.8.5
- sphinxcontrib-websupport==1.1.0
- terminado==0.8.2
- testpath==0.4.2
- theano==1.0.4
- timezonefinder==4.0.1
- tqdm==4.31.1
- traitlets==4.3.2
- twine==1.13.0
- typing==3.6.6
- urllib3==1.24.1
- utm==0.4.2
- wcwidth==0.1.7
- webencodings==0.5.1
- widgetsnbextension==3.4.2
- xlrd==1.2.0
- xlwt==1.3.0
- deap==1.3.0
【问题讨论】:
是的,那是一团糟。从哪里开始... 很可能其中大部分是不必要的(如果你不在中国,你肯定不需要那些中国镜像频道)。我对我们帮助你直接解决这个问题感到绝望。你最好的机会是如果你真的有一些你正在尝试运行的代码库。 GREP 用于导入语句,然后只保留导入的内容。如果某些东西在 Conda 中有一个等效的包,那么它确实应该从pip
部分中移出,但这只是一种很好的做法,而不是朝着创建 env 的目标迈进。
@merv 我担心这就是答案。我只是好奇为什么当dependencies
中的路径是2.13.1
并且我已经通过conda install fontconfig=2.13.1
安装它时,它会检查version='>=2.12.6,<3.0a0'
之类的冲突路径。
我不太确定。如果我不得不猜测,似乎当 Conda 进入冲突解决模式时,它会将显式规范 fontconfig=2.13.1
视为另一个约束,以及来自所有将其作为依赖项的包的约束(例如,fontconfig[version='>=2.12.6,<3.0a0']
) 然后尝试找到交叉点。也许它只是没有意识到,因为您的所有规格都是明确的构建,实际上没有回旋余地。
【参考方案1】:
这个错误和随后的行为很可能来自Anaconda bug,这不时会导致本地环境不一致。截至 2020 年 1 月 26 日,该错误尚未解决。
对我来说,同样的问题在 Mac 上也很明显。
【讨论】:
此问题已关闭,未修复。【参考方案2】:一般来说,这个问题的答案是您应该从头开始创建您的 .yml,只使用所需的通道和约束。您应该放宽版本限制,使它们看起来像 1.19 而不是 1.19.10
然而,尽管遵循了这个建议,我现在几乎完全遇到了你的问题。它在 fontconfig 上花了很多时间,我在放弃之前把它留了一夜。我的规范很简单:
channels:
- conda-forge
- usgs-astrogeology
- defaults
dependencies:
- python=3.6
- isis3
- gdal=2.3
等我弄明白了再编辑。
编辑:这里正在讨论这个问题(特定于我尝试设置的软件,可能对其他人没有帮助)https://github.com/USGS-Astrogeology/ISIS3/issues/3570
【讨论】:
我也是因为gdal来到这里的,奇怪的是和seaborn冲突..【参考方案3】:对我来说,在 yaml 文件中添加以下内容是可行的:
channels:
- conda-forge
- defaults
- conda-forge/label/broken
【讨论】:
【参考方案4】:就我而言,我已经替换了一些构建版本(...=he4413a7_1000
部分),因为原始文件中的版本在conda-forge
上已重新标记为broken
。但是,即使这些依赖项的版本号没有改变,它们的子依赖项也发生了变化,从而导致了所有这些冲突。底线是:不要手动弄乱依赖关系。
我通过保留原始构建版本规范并将conda-forge/labels/broken
添加到.yml
文件的channels
部分解决了这个问题。
【讨论】:
【参考方案5】:我遇到了同样的问题,这是我加快环境创建速度的方法。这些命令在 *nix 中,但我会告诉他们在做什么。
我复制了enviroment.yml' to
environment-clean.yml`并开始编辑第二个文件。我维护了“名称”和“频道”部分。
现在我检查了代码使用了哪些库。由于它只是一堆 Jupyter 笔记本,所有文件都在同一个目录中。也许您将不得不递归地执行此操作。下面的命令列出了导入、删除和重复:
grep import -h *.ipynb |grep -v undefined|sort |uniq
现在我手动编辑了environment-clean.yml
文件。首先包括最初使用的python版本。您可以从每个包裹后的 id 中找到它。所以py39h8c16a72_0
会告诉你你正在使用python 3.9。将- python=3.9
作为依赖项。 pandas 的一个很好的特性是你可以拥有不同 python 版本的环境。
然后我删除了除了直接导入的文件之外的所有内容。我维护了版本号,并删除了名称后的 id。所以- pandas=1.3.1=py39h8c16a72_0
会变成- pandas=1.3.1
。
文件中没有任何依赖项。
现在只需创建它:
conda env create -f environment-clean.yml
Conda 环境并不是真正的多平台环境。我的建议是始终使用命令conda env export --from-history
创建它们,因此只包含显式安装的包。不会安装依赖项的依赖项。您必须安装它们以修复版本号。
【讨论】:
【参考方案6】:我遇到了这个问题并解决了。 首先,我使我的 anaconda 版本与 yaml 文件导出的位置一致。这可能没用,但我认为一致的 conda 版本可以保证一致的基础环境。 其次,我删除了所有依赖项,但我实际上想在我的 yaml 文件中使用一些“主”包。这意味着让这些“主”包处理依赖问题。
【讨论】:
【参考方案7】:截至 2020 年 2 月 17 日,我在 Windows 10 上也遇到了同样的问题,使用 pycharm 和 anaconda (python 3.7) 最新版本。奇怪的是,在 pycharm 的设置中切换项目解释器页面上的“使用 conda 包管理器”允许我更新 numpy 并正常安装包。尝试在没有 conda 包管理器和 conda 包管理器的情况下安装包。祝你好运!
【讨论】:
【参考方案8】:对我来说最好的做法是:
which python
(确认它在 anaconda3 bin 中)
python --version
conda search "^python$"
注意哪个版本与 Anaconda 使用的版本(此处为 3.7.3)相匹配(因为我正在创建一个新环境,所以我可以使用与 Anaconda 本身使用的相同版本的 Python)。请注意,我在 conda 频道(上面的 conda 搜索)中的列表只显示了一条 3.7.3 行。
然后这样做:
conda create -n myenv python=3.7.3 anaconda
运行最后一个命令大约需要 1 分钟 :)
【讨论】:
以上是关于创建 conda 环境:“发现冲突!”当解决环境和“寻找最短冲突路径”永远运行时的主要内容,如果未能解决你的问题,请参考以下文章
【Anaconda】conda创建虚拟环境不报错,但是虚拟环境无法生成的解决办法
使用conda创建虚拟环境,并将虚拟环境加载到jupyter notebook中已解决
解决环境:使用 current_repodata.json 失败,将使用下一个 repodata 源重试。 Conda 无法创建新环境