0

我通过“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 不知何故坏了?谢谢!

4

1 回答 1

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。


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

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

>>> 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

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

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

于 2013-09-30T18:37:10.897 回答