如何查找python模块使用的共享库?

时间:2017-11-16 17:40:13

标签: python gtk shared-libraries pygtk jhbuild

我正在调试基于pygtk的python程序,我想确保该程序使用正确的共享库。

pygtk是python的GTK+包装器。我已经使用GTK+工具编译了jhbuild,我想确保我正在调试的python脚本使用jhbuild中的编译库。

可以像这样导入gtkpygtk

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 个答案:

答案 0 :(得分:6)

我假设您使用的是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
...

答案 1 :(得分:1)

每当我想知道谁使用了什么,strace是我最好的朋友。 因此strace -ff -olog -eopen python yourscript.py为您提供此流程中打开的所有文件及其子项的列表。它将文件存储在log.*个文件中,扩展名为进程的pid。然后你只需grep -i gtk log.* | grep py并查看结果。

但是,我想知道为什么你使用pygtk(过时和弃用,2011年最后一个版本)只适用于GTK + 2.这只有在你调试非常老的时才有用使用仍然使用GTK + 2的非常旧的 jhbuild模块集编程。

如果可以,您应该努力使用pygobject和GTK + 3。

https://python-gtk-3-tutorial.readthedocs.org/en/latest/index.html