【问题标题】:Conda package bug? binary incompatability康达包错误?二进制不兼容
【发布时间】:2021-05-13 10:20:04
【问题描述】:

我正在一个系统上的远程 Jupyter 笔记本上工作,我没有 root 访问权限,甚至没有可以在其中进行许多调整的 shell。我可以从 Conda 的存档中检索包并在安装此类包的笔记本单元中运行函数

!conda install /path/to/package-vvv.tar.bz2

我遇到了我猜错版本号的情况,安装了不兼容的东西。错误消息类似于我在下面生成的错误消息,numpy 或 mkl 中的二进制不兼容。

现在我正在重新跟踪我拥有管理员访问权限的 Ubuntu 20.10 笔记本上的问题。我有一个可重现的问题要展示和分享。

  1. 使用与远程机器上相同版本的 python、numpy 和 pandas 创建环境:
$ conda create -n cenv-py368 python=3.6.8 pandas=1.1.2 numpy=1.15.4
Solving environment: done


==> WARNING: A newer version of conda exists. <==
  current version: 4.5.12
  latest version: 4.9.2

Please update conda by running

    $ conda update -n base -c defaults conda

## Package Plan ##

  environment location: /home/pauljohn/LinuxDownloads/miniconda3/envs/cenv-py368

  added / updated specs:
    - numpy=1.15.4
    - pandas=1.1.2
    - python=3.6.8


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    libffi-3.2.1               |    hf484d3e_1007          52 KB
    python-3.6.8               |       h0371630_0        34.4 MB
    libgcc-ng-9.1.0            |       hdf63c60_0         8.1 MB
    libstdcxx-ng-9.1.0         |       hdf63c60_0         4.0 MB
    blas-1.0                   |              mkl           6 KB
    _libgcc_mutex-0.1          |             main           3 KB
    ------------------------------------------------------------
                                           Total:        46.6 MB

The following NEW packages will be INSTALLED:

    _libgcc_mutex:   0.1-main
    blas:            1.0-mkl
    ca-certificates: 2021.1.19-h06a4308_0
    certifi:         2020.12.5-py36h06a4308_0
    intel-openmp:    2020.2-254
    libedit:         3.1.20191231-h14c3975_1
    libffi:          3.2.1-hf484d3e_1007
    libgcc-ng:       9.1.0-hdf63c60_0
    libgfortran-ng:  7.3.0-hdf63c60_0
    libstdcxx-ng:    9.1.0-hdf63c60_0
    mkl:             2020.2-256
    mkl-service:     2.3.0-py36he8ac12f_0
    mkl_fft:         1.2.0-py36h23d657b_0
    mkl_random:      1.1.1-py36h0573a6f_0
    ncurses:         6.2-he6710b0_1
    numpy:           1.15.4-py36h7e9f1db_0
    numpy-base:      1.15.4-py36hde5b4d6_0
    openssl:         1.1.1i-h27cfd23_0
    pandas:          1.1.2-py36he6710b0_0
    pip:             20.3.3-py36h06a4308_0
    python:          3.6.8-h0371630_0
    python-dateutil: 2.8.1-pyhd3eb1b0_0
    pytz:            2021.1-pyhd3eb1b0_0
    readline:        7.0-h7b6447c_5
    setuptools:      52.0.0-py36h06a4308_0
    six:             1.15.0-pyhd3eb1b0_0
    sqlite:          3.33.0-h62c20be_0
    tk:              8.6.10-hbc83047_0
    wheel:           0.36.2-pyhd3eb1b0_0
    xz:              5.2.5-h7b6447c_0
    zlib:            1.2.11-h7b6447c_3

Proceed ([y]/n)? y


Downloading and Extracting Packages
libffi-3.2.1         | 52 KB     | ##################################### | 100%
python-3.6.8         | 34.4 MB   | ##################################### | 100%
libgcc-ng-9.1.0      | 8.1 MB    | ##################################### | 100%
libstdcxx-ng-9.1.0   | 4.0 MB    | ##################################### | 100%
blas-1.0             | 6 KB      | ##################################### | 100%
_libgcc_mutex-0.1    | 3 KB      | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate cenv-py368
#
# To deactivate an active environment, use
#
#     $ conda deactivate
  1. 激活那个环境。

  2. 例如安装名为“fastparquet”的包:

(cenv-py368) $ conda install fastparquet
Solving environment: done

==> WARNING: A newer version of conda exists. <==
  current version: 4.5.12
  latest version: 4.9.2

Please update conda by running

    $ conda update -n base -c defaults conda


## Package Plan ##

  environment location: /home/pauljohn/LinuxDownloads/miniconda3/envs/cenv-py368

  added / updated specs:
    - fastparquet

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pyparsing-2.4.7            |     pyhd3eb1b0_0          59 KB
    packaging-20.9             |     pyhd3eb1b0_0          35 KB
    ------------------------------------------------------------
                                           Total:          95 KB

The following NEW packages will be INSTALLED:

    fastparquet: 0.5.0-py36h6323ea4_1
    libllvm10:   10.0.1-hbcb73fb_5
    llvmlite:    0.34.0-py36h269e1b5_4
    numba:       0.51.2-py36h0573a6f_1
    packaging:   20.9-pyhd3eb1b0_0
    pyparsing:   2.4.7-pyhd3eb1b0_0
    thrift:      0.11.0-py36hf484d3e_0

Proceed ([y]/n)? y


Downloading and Extracting Packages
pyparsing-2.4.7      | 59 KB     | ##################################### | 100%
packaging-20.9       | 35 KB     | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
  1. 观察导入失败
(cenv-py368) $ python
Python 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 01:22:34)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import fastparquet
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pauljohn/LinuxDownloads/miniconda3/envs/cenv-py368/lib/python3.6/site-packages/fastparquet/__init__.py", line 5, in <module>
    from .core import read_thrift
  File "/home/pauljohn/LinuxDownloads/miniconda3/envs/cenv-py368/lib/python3.6/site-packages/fastparquet/core.py", line 9, in <module>
    from . import encoding
  File "/home/pauljohn/LinuxDownloads/miniconda3/envs/cenv-py368/lib/python3.6/site-packages/fastparquet/encoding.py", line 13, in <module>
    from .speedups import unpack_byte_array
  File "fastparquet/speedups.pyx", line 1, in init fastparquet.speedups
ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject
>>> AA

你同意我发现了一个错误吗?

似乎 Conda 应该可以工作,或者应该说没有兼容的 fastparquet 版本。

【问题讨论】:

    标签: numpy python-3.6 conda fastparquet


    【解决方案1】:

    这是您正在导入的一些 Python 库的准备过程中的一个缺陷。当像 fastparquet 这样的包的作者没有为他们的包正确设置 numpy 或 python 的最低兼容版本时,Conda 环境协调无法知道包不正确。 Conda 提供了该软件包作为解决方案,尽管实际上并非如此。

    从更大的意义上说,这是 Conda 查找兼容包的方式中的一个缺陷。也许它按预期工作,所以它不是一个错误。但这是一个缺陷,从某种意义上说,当用户指定 numpy=1.15 时,Conda 的正确答案应该是“没有兼容的包”。但是,因为 Conda 依赖于贡献包的版本依赖,所以它不能这样做。

    我在为 RedHat 或 Debian Linux 系统打包时没有遇到同样的问题,他们倾向于报告“无”而不是提供不准确的匹配。

    【讨论】:

    【解决方案2】:

    该错误通常表明 NumPy 比使用它的库更旧,在本例中为 fastparquet。尝试将 Python 版本更新到 3.7 或 3.8; Python 3.6 和 NumPy 1.15 目前不在推荐的版本中。 (将 Python 更新到 3.7+ 也应该更新 NumPy;当您执行 conda update ... 时通常不会这样做)。一些食谱固定到 &gt;= 一些最低版本,这个似乎没有。

    https://numpy.org/neps/nep-0029-deprecation_policy.html#support-table

    【讨论】:

    • 他们已将 NumPy 明确指定为 1.15.4,这将阻止它更新,除非规范发生更改。要覆盖该确切规范,需要运行 (1) conda install numpy=X.X(具有特定版本)或 (2) conda install --update-specs numpy 序列(解锁显式规范),然后运行 ​​conda update numpy。如果 Python 需要改变,那么应该创建一个新环境,因为几乎每个包都会更新。
    • 并没有真正回答关于 Conda 包装的问题。 Conda 弄错了,我认为@merve 说得对,这是 fastparquet 或其他没有 numpy 版本下限的包装中的错误。在我必须解决问题的远程系统上,我无法更新 Python 或 numpy。这就是我在系统中修复版本的原因。在我的本地系统中,我了解如何解决问题。
    • 您使用的是旧版本的 Python 和 NumPy,而 conda 尊重这些引脚 - 这不是 conda 问题。
    • @MattThompson 如果 Conda 返回应该与系统一起使用的 fastparquet 版本(numpy 固定不变),它应该可以工作。或者康达不应该返回任何东西。你不同意吗?
    • Conda,一个包管理器,只能做它被告知的事情——用户告诉它的(“请使用这些包的旧版本”)和配方指定的(“任何版本numpy的很好”)。它正在使用提供的信息找到正确的解决方案。在这种情况下,该信息是错误的。正如您所指出的,配方的最低版本可能应该是 1.16 左右。请考虑@merv 的建议来更新原料,或者至少向维护者报告这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2011-08-03
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多