pyplot gtk2 conflicts with gtk3

Intro.

起因是mxnet在这台装着12.04的 Pentium(R) 4上面和pyplot过不去,只有当pyplot先被导出的情况下才可以避免dump的厄运,然而这显然不可靠。

>>> import mxnet as mx
>>> import matplotlib.pyplot as plt

(.:3470): Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
Trace/breakpoint trap (core dumped)

Reason

原因是mxnet调用了gtk2,pyploy 调用了gtk3:

$ ldd libmxnet.so | grep -i gtk
	libgtk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 (0xb57de000)

将tgk的静态库重命名后启动pyplot就知道连接了gtk3

Lookup

问题仅限于这位32bits Machine,其他机器上没问题,所以应该是版本陈旧了,然而pkg里面没有找到gtk3的影子:

$ pkg-config --list-all | grep -i gtk
gkrellm                        GKrellM - Extensible GTK system monitoring application
gtk+-unix-print-2.0            GTK+ - GTK+ Unix print support
gdk-2.0                        GDK - GTK+ Drawing Kit (x11 target)
gtk+-x11-2.0                   GTK+ - GTK+ Graphical UI Library (x11 target)
gdk-x11-2.0                    GDK - GTK+ Drawing Kit (x11 target)
gtk+-2.0                       GTK+ - GTK+ Graphical UI Library (x11 target)

一般这种由版本陈旧引起的问题很少能得到关注,连相近的情况的例子都没怎么找到,要找到match的.. 几乎绝望(所以给自己说,要是能把这问题搞掉一定记下来... )。社区里面也是各舒己见,并没有简单易行又能work的,(ps: 这个问题时断时续,曾经有两段时间是可以兼容的,最近又开始不工作了...orz,这次准备彻底解决)。

一个差点work的答案是这个,产生最终答案(并不完美)的例子是这个

Solution (not perfect)

然而用上面的答案,并不能最终work,虽然可以使两者在导出时没有问题,但plt.show()却不能正常工作,幸运的是,换一个名称看起来可以工作了:

>>> import mxnet as mx
>>> import matplotlib
>>> matplotlib.use('Qt4Agg')
>>> import matplotlib.pyplot as plt 

nice 😃


6 Jul, 2017 记

使用Qt4Agg可能存在些问题,在某些版本的某些应用中。
比如,今早在这台32-bit的机器上。
发现在使用plt.clf命令时没有效果,这条命令的目的是为了更新title以作GUI的提示,但使用之后发现没有得到更新,而是等到下次GUI交互时才被更新(这样就根本达不到提示的效果)。
此时的解决方案是换回TkAgg:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
posted @ 2017-06-23 10:30  rotxin  阅读(1017)  评论(0编辑  收藏  举报