Как найти разделяемую библиотеку, используемую модулем 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

Другие вопросы по тегам