Как найти разделяемую библиотеку, используемую модулем Python?
Я отлаживаю программу на Python, основанную на pygtk, и хочу убедиться, что программа использует правильную разделяемую библиотеку.
pygtk
это GTK+
обертка для питона. Я уже скомпилировал GTK+
с помощью jhbuild
инструмент, и я хочу убедиться, что скрипт Python, который я отлаживаю, использует скомпилированную библиотеку из jhbuild
,
Можно было бы импортировать gtk
а также pygtk
как это:
import gtk
import pygtk
print(gtk.__file__)
# /usr/lib/python2.7/site-packages/gtk-2.0/gtk/__init__.pyc
print(pygtk.__file__)
# /usr/lib/python2.7/site-packages/pygtk.pyc
Например, я могу показать окно, используя gtk:
w = gtk.Window()
w.show()
Это нарисует окно на экране, используя GTK. Однако я не знаю, какой общий объект будет использоваться. У меня установлено много версий, и мне нужно найти виновника.
2 ответа
Я предполагаю, что вы используете Linux, если модуль загружается динамически, вы можете узнать это с помощью lsof(8)
:
$ python
>>> import os
>>> os.getpid()
29982
$ lsof -p 29982 > before
затем вернемся к python, импортируем модуль:
>>> import gtk
$ lsof -p 29982 > after
$ diff <(awk '{print $NF}' after) <(awk '{print $NF}' before)
выходы:
< /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0.3200.2
< /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
< /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0.2400.30
< /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.30
< /usr/lib/python2.7/dist-packages/gtk-2.0/gtk/_gtk.so
...
Всякий раз, когда я хочу знать, кто чем пользуется, strace
мой лучший друг. Так strace -ff -olog -eopen python yourscript.py
дает вам список всех файлов, открытых в этом процессе и его дочерних элементов. Он хранит файлы в log.*
файлы с расширением pid
процесса. Тогда ты просто grep -i gtk log.* | grep py
и посмотрите на результаты.
Тем не менее, мне интересно, почему вы используете pygtk
(устаревший и устаревший, последний выпуск в 2011 году), который работает только с GTK+ 2. Это полезно, только если вы отлаживаете очень старую программу с очень старой jhbuild
moduleset, который все еще использует GTK+ 2.
Если вы можете, вы должны стремиться использовать pygobject
и GTK + 3.
https://python-gtk-3-tutorial.readthedocs.org/en/latest/index.html