为什么我自己构建的 PyGObject 在导入 Gtk 或 Gdk 时会崩溃?

6

编辑: 我已经尝试导入 /usr/lib/girepository-1.0 中代表的几乎所有库,通过 gi.repository 它们都可以正常工作,除了 Gtk 和 Gdk。我已更新标题以反映这一点。


我需要一个自建的 PyGObject 库来配合自建的 Python 3.3.3 使用。我使用 sudo apt-get build-dep python3-gi 安装了 PyGObject 的所有依赖项。我发现工作系统的 PyGObject 版本是 3.2.2,所以我从 Git 存储库中检出了版本 3.2.2 的源代码。然后我运行了以下命令:

autoreconf --force --install
./configure --prefix=/home/tomas/.pyenv/versions/3.3.3
make
make install

一切都编译和安装得很好。我打开了一个新的 CMD 窗口,并将工作目录设置为 ~,然后执行了以下操作:

~$ python
Python 3.3.3 (default, Dec 21 2013, 23:12:28) 
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gi.repository import Gtk
Segmentation fault (core dumped)
~$ 

我将 LD_LIBRARY_PATH 设置为 /home/tomas/.pyenv/versions/3.3.3/lib 并检查了正确的库是否被加载:

~$ ldd .pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/_gi.so
    linux-vdso.so.1 =>  (0x00007fffcdf51000)
    libgirepository-1.0.so.1 => /usr/lib/libgirepository-1.0.so.1 (0x00007f45d8304000)
    libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f45d80b5000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f45d7dbf000)
    libpyglib-gi-2.0-python.so.0 => /home/tomas/.pyenv/versions/3.3.3/lib/libpyglib-gi-2.0-python.so.0 (0x00007f45d7bba000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f45d799d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45d75dc000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f45d72e0000)
    libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f45d70dc000)
    libgio-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f45d6d8c000)
    libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f45d6b84000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f45d6947000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f45d673e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f45d877b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f45d653a000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f45d6323000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f45d6103000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f45d5ee7000)
这是一个关于it技术的内容,展示了一个python模块所需要的依赖库。
我也使用python -vv导入了模块:Pastebin

最后几行显示,导入gi.repository.Atk之后就会出现核心转储:

# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/repository/Atk.cpython-33m.so
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/repository/Atk.abi3.so
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/repository/Atk.so
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/repository/Atk.py
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/repository/Atk.pyc
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/overrides/Atk.cpython-33m.so
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/overrides/Atk.abi3.so
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/overrides/Atk.so
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/overrides/Atk.py
# trying /home/tomas/.pyenv/versions/3.3.3/lib/python3.3/site-packages/gi/overrides/Atk.pyc
import 'gi.repository.Atk' # 
Segmentation fault (core dumped)

仅导入gi.repository.Atk不会出现分段错误。

我还尝试删除系统版本的库(sudo dpkg -P python3-gi),以防它在某种程度上干扰。


我不知道还能做什么。有人知道或有什么想法是什么问题吗?如果您有任何想法可以尝试或者需要提供更多信息请留言。


当它发生时,你能获取一个堆栈跟踪吗? - drahnr
@drahnr:我现在已经编译了Python和PyGObject的调试符号。堆栈跟踪对我来说仍然毫无意义,但至少现在它更大了!http://pastebin.com/raw.php?i=W4vhd3rj - Hubro
除了与某些ceval foo相关,没有什么值得一看的,这也是可以预料的... - drahnr
@drahnr:我还能提供什么其他信息吗?有什么线索可能出了问题吗? - Hubro
1
是的,确实是这样...我稍后会看一下,但我从未深入研究过Python解释器代码或ctypes代码。 - drahnr
显示剩余4条评论
1个回答

7

PyGObject对于Glib和Python有很强的前置要求。

就其价值而言,我会批量构建各种组合集以找到可工作的组合。

请注意,正如Simon Feltman在下面的评论中解释的那样,pycairo不是严格的依赖项,可以使用--enable-cairo=no 配置选项禁用它。 它只出现在这里,因为我使用了默认构建选项进行测试。

以下是我在Debian Wheezy / Wheezy-backports系统(GLib 2.33)上的结果:

python      pygobject   pycairo     compile           ... import Gtk    

3.1         3.0         1.0         NO (pycairo)                        
3.1         3.0         1.10        YES               OK                
3.1         3.0         1.2         NO (pycairo)                        
3.1         3.0         1.4         NO (pycairo)                        
3.1         3.0         1.6         NO (pycairo)                        
3.1         3.0         1.8         NO (pycairo)                        
3.1         3.2         1.0         NO (pycairo)                        
3.1         3.2         1.10        YES               OK                
3.1         3.2         1.2         NO (pycairo)                        
3.1         3.2         1.4         NO (pycairo)                        
3.1         3.2         1.6         NO (pycairo)                        
3.1         3.2         1.8         NO (pycairo)                        
3.1         3.4         1.0         NO (pycairo)                        
3.1         3.4         1.10        NO (pygobject)                      
3.1         3.4         1.2         NO (pycairo)                        
3.1         3.4         1.4         NO (pycairo)                        
3.1         3.4         1.6         NO (pycairo)                        
3.1         3.4         1.8         NO (pycairo)                        
3.1         3.6         1.0         NO (pycairo)                        
3.1         3.6         1.10        NO (pycairo)                        
3.1         3.6         1.2         NO (pycairo)                        
3.1         3.6         1.4         NO (pycairo)                        
3.1         3.6         1.6         NO (pycairo)                        
3.1         3.6         1.8         NO (pycairo)                        
3.1         3.8         1.0         NO (pycairo)                        
3.1         3.8         1.10        NO (pygobject)                      
3.1         3.8         1.2         NO (pycairo)                        
3.1         3.8         1.4         NO (pycairo)                        
3.1         3.8         1.6         NO (pycairo)                        
3.1         3.8         1.8         NO (pycairo)                        
3.2         3.0         1.0         NO (pycairo)                        
3.2         3.0         1.10        YES               OK                
3.2         3.0         1.2         NO (pycairo)                        
3.2         3.0         1.4         NO (pycairo)                        
3.2         3.0         1.6         NO (pycairo)                        
3.2         3.0         1.8         NO (pycairo)                        
3.2         3.2         1.0         NO (pycairo)                        
3.2         3.2         1.10        YES               OK                
3.2         3.2         1.2         NO (pycairo)                        
3.2         3.2         1.4         NO (pycairo)                        
3.2         3.2         1.6         NO (pycairo)                        
3.2         3.2         1.8         NO (pycairo)                        
3.2         3.4         1.0         NO (pycairo)                        
3.2         3.4         1.10        NO (pygobject)                      
3.2         3.4         1.2         NO (pycairo)                        
3.2         3.4         1.4         NO (pycairo)                        
3.2         3.4         1.6         NO (pycairo)                        
3.2         3.4         1.8         NO (pycairo)                        
3.2         3.6         1.0         NO (pycairo)                        
3.2         3.6         1.10        NO (pycairo)                        
3.2         3.6         1.2         NO (pycairo)                        
3.2         3.6         1.4         NO (pycairo)                        
3.2         3.6         1.6         NO (pycairo)                        
3.2         3.6         1.8         NO (pycairo)                        
3.2         3.8         1.0         NO (pycairo)                        
3.2         3.8         1.10        NO (pygobject)                      
3.2         3.8         1.2         NO (pycairo)                        
3.2         3.8         1.4         NO (pycairo)                        
3.2         3.8         1.6         NO (pycairo)                        
3.2         3.8         1.8         NO (pycairo)                        
3.3         3.0         1.0         NO (pycairo)                        
3.3         3.0         1.10        YES               SEGMENTATION FAULT
3.3         3.0         1.2         NO (pycairo)                        
3.3         3.0         1.4         NO (pycairo)                        
3.3         3.0         1.6         NO (pycairo)                        
3.3         3.0         1.8         NO (pycairo)                        
3.3         3.2         1.0         NO (pycairo)                        
3.3         3.2         1.10        YES               SEGMENTATION FAULT
3.3         3.2         1.2         NO (pycairo)                        
3.3         3.2         1.4         NO (pycairo)                        
3.3         3.2         1.6         NO (pycairo)                        
3.3         3.2         1.8         NO (pycairo)                        
3.3         3.4         1.0         NO (pycairo)                        
3.3         3.4         1.10        NO (pygobject)                      
3.3         3.4         1.2         NO (pycairo)                        
3.3         3.4         1.4         NO (pycairo)                        
3.3         3.4         1.6         NO (pycairo)                        
3.3         3.4         1.8         NO (pycairo)                        
3.3         3.6         1.0         NO (pycairo)                        
3.3         3.6         1.10        NO (pycairo)                        
3.3         3.6         1.2         NO (pycairo)                        
3.3         3.6         1.4         NO (pycairo)                        
3.3         3.6         1.6         NO (pycairo)                        
3.3         3.6         1.8         NO (pycairo)                        
3.3         3.8         1.0         NO (pycairo)                        
3.3         3.8         1.10        NO (pygobject)                      
3.3         3.8         1.2         NO (pycairo)                        
3.3         3.8         1.4         NO (pycairo)                        
3.3         3.8         1.6         NO (pycairo)                        
3.3         3.8         1.8         NO (pycairo)   

许多组合由于需要比我系统上可用的GLib版本更新的版本而无法构建。在某些情况下,setup.py脚本需要python-2,因此在仅有python-3的环境中安装过程失败了。我没有花时间去理解为什么一些组合会在运行时导致段错误(segmentation fault)

正如你所看到的,在Debian上至少今天,最好的选择是构建pycairo-1.10 + pygobject-3.2 + python 3.2。任何更新的版本都需要至少一个更新的GLib版本...


2
请注意,pycairo不是严格的依赖项。它仅在需要使用cairo进行自定义小部件绘制的GUI代码中才需要。可以通过配置标志“--enable-cairo=no”来删除此功能,并且实际上大多数发行版都将其拆分为单独的软件包。就Python devel依赖性而言,它毕竟是一个Python C扩展。至于认为PyGObject“一丝不苟”,这对我作为维护者来说实际上是有用的反馈! - Simon Feltman
1
感谢Simon的评论和在PyGObject上担任维护者的时间;)也许“一丝不苟”这个词在英语中更具有负面意义?无论如何,请不要误解我的话:我最失望的是不能在我的Debian系统上使用比3.2更新的版本。以上所有结果都使用默认构建选项。老实说,由于我遇到了与OP相同的问题(“分段错误”),所以我只进行了一堆“快速而肮脏”的构建作为测试……没有花时间探索各种配置选项!真是太丢人了…… - Sylvain Leroux
@SimonFeltman 我重新表述了答案的前几段,以考虑到您的评论。如果您认为这个答案仍然存在问题,请不要犹豫告诉我。 - Sylvain Leroux
我对这个答案所代表的工作量感到惊叹,但很失望地发现我的自己在Debian Wheezy中使用python3.3和pygobject的努力是徒劳的。 - Bobble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接