如何找到 python 模块使用的共享库?
How to find shared library used by a python module?
我正在调试一个基于 pygtk 的 python 程序,我想确保该程序使用正确的共享库。
pygtk
是 python 的 GTK+
包装器。我已经使用 jhbuild
工具编译了 GTK+
,我想确保我正在调试的 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:
显示 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
我正在调试一个基于 pygtk 的 python 程序,我想确保该程序使用正确的共享库。
pygtk
是 python 的 GTK+
包装器。我已经使用 jhbuild
工具编译了 GTK+
,我想确保我正在调试的 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:
显示 windoww = 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