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

How to find shared library used by a python module?

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

pygtk 是 python 的 GTK+ 包装器。我已经使用 jhbuild 工具编译了 GTK+,我想确保我正在调试的 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:

显示 window
w = gtk.Window()
w.show()

这将使用 gtk 在屏幕上绘制 window。但是我不知道使用了哪个共享对象。我安装了很多版本,我需要找到罪魁祸首。

我假设你使用的是 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 看看结果。

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

如果可以,你应该争取使用pygobject和GTK+ 3.

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