【问题标题】:Python 27 can't import shared object from guppyPython 27 无法从 guppy 导入共享对象
【发布时间】:2013-09-25 21:03:33
【问题描述】:

我通过“sudo python setup.py install”从它的 svn#95 安装了 guppy 内存分析器。

看起来安装正确。


yey@yey:/usr/local/lib/python2.7/dist-packages/guppy/heapy$ ls *.so *.py
AbstractAlgebra.py  ImpSet.py          Path.py         Remote.py  Use.py
Classifiers.py      __init__.py        pbhelp.py       RM.py      View.py
Console.py      Monitor.py         Prof.py         Spec.py
Doc.py          OutputHandling.py  RefPat.py       Target.py
heapyc.so       Part.py        RemoteConstants.py  UniSet.py

但我仍然无法导入它。 Guppy 的 Python 源代码会执行此导入,因此它应该会成功。


>>> import guppy.heapy
>>> import guppy.heapy.heapyc
# trying /usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.so
# trying /usr/local/lib/python2.7/dist-packages/guppy/heapy/heapycmodule.so
# trying /usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.py
# trying /usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.pyc
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named heapyc

我的问题是,Python 显然尝试在正确的位置导入文件。为什么失败了?是因为 .so 文件损坏了吗?还是我的 ld.so.cache 不知何故坏了?谢谢!

【问题讨论】:

  • 是的,它可能已损坏,或为空,或完全有效的 ELF 共享对象,但用于错误的架构或平台,或者……如果你想从 Python 中测试它,你可以尝试,例如,import ctypes; ctypes.CDLL('/usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.so'),它将为您提供更多信息的回溯,包括 dlerror 输出,这可能会有所帮助。
  • 非常感谢!原来只是错误的许可。我希望我可以在更好的错误消息上向 Python 提交错误。此外,setup.py 使所有人都能阅读 *.py 而不是 *.so cdll.LoadLibrary('/usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.so') OSError: /usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.so: cannot open shared object file: Permission denied,这也有点奇怪
  • 您应该发布您自己的答案(理想情况下是什么问题,您是如何发现它的,以及您是如何解决的)并接受它,以使未来的读者受益。 (如果你认为我做了大部分工作,我可以写一个答案,但实际上,我认为它属于你。)
  • 我想要,但我的脑海中仍然缺少一个链接。我发现了一些关于 LD_LIBRARY_PATH 的帖子。我想知道为什么它在没有设置的情况下对我有用。 python27 更聪明吗?谢谢! link
  • 完成。顺便说一句,您可以为此提交一个错误,但它会作为“已修复”而关闭,因为 3.1 中的新导入程序已经为您提供了更好的错误消息。 (嗯,我还没有测试过 3.1 是否有,但 3.3 有,而且是 3.1 中的导入程序重写使此类错误消息成为可能。)

标签: python python-2.7 import shared-libraries guppy


【解决方案1】:

.so 文件存在许多可能导致此问题的问题 - 无读取权限、文件损坏、空文件、完全有效的库但平台/架构错误等。更糟糕的是,.so 本身可能没问题,但它可能对具有上述任何问题的不同文件具有加载时依赖性。

不幸的是,Python 2.x 导入器没有向您显示它实际遇到的哪个问题;你只能说,出于某种原因,打开共享库的调用失败了。

值得注意的是,在 3.1 或更高版本中,您会收到更有用的错误消息,如下所示:

ImportError: dlopen(/usr/local/lib/python3.3/dist-packages/guppy/heapy/heapyc.so, 2): no suitable image found.  Did find:
    /usr/local/lib/python3.3/dist-packages/guppy/heapy/heapyc.so: Permission denied

但是,这只是可能的,因为导入器是从头开始为 3.1 重写的,而且不可能将如此彻底的更改向后移植到 2.7。


大多数平台都带有可让您测试共享库的工具,这确实是诊断问题的最佳方式。

但对于简单且独立于平台的测试,您可以只使用 Python 本身附带的 ctypes 库:

>>> import ctypes
>>> ctypes.CDLL('/usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.so')

你应该得到一个错误,像这样:

OSError: /usr/local/lib/python2.7/dist-packages/guppy/heapy/heapyc.so: cannot open shared object file: Permission denied

在这种情况下,文件不可读(或者,在需要共享库可执行的平台上,它要么不可读,要么不可执行),这足以解决问题。所以,chmod a+r 应该修复它(尽管您可能想更进一步,首先弄清楚为什么它不可读)。

如果错误没有告诉您足够的信息来自己修复它,并且搜索也无济于事,那么至少您可以来到 SO 并提出一个更有可能立即得到答案的问题……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多