5

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

pygtkGTK+python的包装器。我已经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 在屏幕上绘制一个窗口。但是我不知道使用了哪个共享对象。我安装了很多版本,我需要找到罪魁祸首。

4

2 回答 2

12

我假设您使用的是 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
...
于 2017-11-17T08:13:16.307 回答
4

每当我想知道谁在使用什么时,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

于 2017-11-17T09:16:55.930 回答