Python 27 не может импортировать общий объект из гуппи
Я установил гуппи профилировщик памяти из svn#95 через "sudo python setup.py install".
Это выглядит правильно установлено.
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
Но я все еще не могу импортировать это. Исходный код Гуппи 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 плохой как-то? Спасибо!
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.
Большинство платформ поставляются с инструментами, позволяющими тестировать разделяемые библиотеки, и это действительно лучший способ диагностики проблемы.
Но для простого и независимого от платформы теста вы можете просто использовать ctypes
библиотека, которая поставляется с самим Python:
>>> 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 и задать вопрос, который с большей вероятностью получит немедленный ответ…