python - 更改导入顺序会导致 Python 中的错误

标签 python python-3.x scipy cython

我试图了解以下错误的原因。首先,如果我在 python 中输入以下内容

>>> import scipy.sparse
>>> import torch

它运行没有错误。但是,当我输入
>>> import torch
>>> import scipy.sparse
I get the following error:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/global/software/sl-7.x86_64/modules/langs/python/3.6/lib/python3.6/site-packages/scipy/sparse/__init__.py", line 229, in <module>
    from .csr import *
  File "/global/software/sl-7.x86_64/modules/langs/python/3.6/lib/python3.6/site-packages/scipy/sparse/csr.py", line 15, in <module>
    from ._sparsetools import csr_tocsc, csr_tobsr, csr_count_blocks, \
ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /global/software/sl-7.x86_64/modules/langs/python/3.6/lib/python3.6/site-packages/scipy/sparse/_sparsetools.cpython-36m-x86_64-linux-gnu.so)

我什至可以转到目录“/global/software/sl-7.x86_64/modules/langs/python/3.6/lib/python3.6/site-packages/scipy/sparse/”并导入二进制文件“_sparsetools.cpython- 36m-x86_64-linux-gnu.so”后跟火炬没有问题。但是如果我反过来尝试,我会再次收到上述错误。

有谁知道为什么改变这些导入的顺序会产生不同的效果?

最佳答案

共享对象的简单搜索策略假定每个都存在一个版本——或者至少存在包含 的目录。较新 版本首先放在搜索路径上。路径包括$LD_LIBRARY_PATH (应该避免),DT_RPATH及其更新的变体 DT_RUNPATH (这主要取决于 客户端 正在加载)和系统目录,如 /lib .这适用于遵循 FHS 的系统与 全局包管理,但已安装的包,使用 副本它们的依赖项,在一个单独的包目录中(在 Windows 上很常见,并且有一些“普通用户”包管理器)可以轻松地生成具有相同 soname 的共享对象的多个版本。 .

期望共享该名称是 无害因为一个可以用来代替另一个(因此可以放在路径的第一个位置)。现实情况是,对于所有库来说,没有一个目录是最新的,甚至没有一个指向 的路径。配置 鉴于 DT_标签。

结果是随便一个加载第一 wins:动态加载器不能同时加载它们(因为它们提供了许多相同的符号),所以第二个请求只有检查库版本标签的效果,这里发现这是不够的。在这种情况下,一个客户端 ( torch ) 依赖于系统的 C++ 标准库,而另一个 ( _sparsetools ) 有自己的更新版本。它可能会也可能不会需要它的较新版本:由于它是针对它构建的,因此保守地将其标记为默认情况下需要它。

这是一个 hard problem :甚至不是虚拟环境或 environment modules 之类的工具可以处理它,因为问题在于现有包的编译不兼容。从 重建一切的系统来源 (如 NixSpack )可以,但只能以控制所有相关构建的通常成本为代价。可能只是控制不幸的是,进口订单是可用的最佳选择。

关于python - 更改导入顺序会导致 Python 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59366730/

相关文章:

python - 如何在不提供文件名的情况下执行 python?

python - 在Python中捕获特定的错误消息

python - 在Python中删除CSR格式矩阵的列

python - 如何通过 Python 使用 COM INetCfg 对象?

python - 将来自 NLTK NaiveBayesClassifier 的信息量最大的特征存储在列表中

python - 将追加函数映射到列表

python - 使用 Python 和 BeautifulSoup 抓取 Amazon 数据时出错

python - bpy.ops.sequencer.view_all() 轮询失败

python - 在 Python 中解析 XML 节点中的文本

python - 现实世界的盲源分离