pygtk和native gtk_main();混合

2024-09-30 06:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试开发一个基于C的应用程序,它嵌入了一个或多个Python解释器。我在C-parts中使用gtk东西,并在其中逻辑地调用gtk_main()。在

Python解释器是使用Py_NewInterpreter()在单独的pthread中创建的,基本上永远运行(如果脚本终止,会在末尾添加一个“while True”循环)。在

现在我想在这些脚本中使用pyGTK,直到出现回调(发出信号)为止,它似乎都可以工作。您可以注册信号处理程序来指向Python脚本中的部分,但是gtk主循环似乎无法在它们发生时正确地引导它们,从而导致如下日志所示的segfaults。在

我猜这可能与python线程状态没有正确初始化有关,但不确定。有没有人知道我做错了什么或者要检查什么?在

#0  0xb7ecfc9a in PyFrame_New () from /usr/lib/libpython2.5.so.1.0
#1  0xb7f376ed in PyEval_EvalCodeEx () from /usr/lib/libpython2.5.so.1.0
#2  0xb7ed09b6 in ?? () from /usr/lib/libpython2.5.so.1.0
#3  0xb7eae327 in PyObject_Call () from /usr/lib/libpython2.5.so.1.0
#4  0xb7f30f7c in PyEval_CallObjectWithKeywords () from /usr/lib/libpython2.5.so.1.0
#5  0xb7eaeb5c in PyObject_CallObject () from /usr/lib/libpython2.5.so.1.0
#6  0xb424face in ?? () from /usr/lib/pymodules/python2.5/gtk-2.0/gobject/_gobject.so
#7  0xb76e113a in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#8  0xb76f761d in ?? () from /usr/lib/libgobject-2.0.so.0
#9  0xb76f8bfc in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#10 0xb76f9076 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#11 0xb7ab3a8a in gtk_button_clicked () from /usr/lib/libgtk-x11-2.0.so.0
#12 0xb7ab5048 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#13 0xb76eecac in g_cclosure_marshal_VOID__VOID () from /usr/lib/libgobject-2.0.so.0
#14 0xb76df7a9 in ?? () from /usr/lib/libgobject-2.0.so.0
#15 0xb76e113a in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#16 0xb76f6eba in ?? () from /usr/lib/libgobject-2.0.so.0
#17 0xb76f8bfc in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#18 0xb76f9076 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#19 0xb7ab3b2a in gtk_button_released () from /usr/lib/libgtk-x11-2.0.so.0
#20 0xb7ab3b73 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#21 0xb7b70e74 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#22 0xb76df7a9 in ?? () from /usr/lib/libgobject-2.0.so.0
#23 0xb76e113a in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#24 0xb76f7266 in ?? () from /usr/lib/libgobject-2.0.so.0
#25 0xb76f8a7b in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#26 0xb76f9076 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#27 0xb7c9d156 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#28 0xb7b694cd in gtk_propagate_event () from /usr/lib/libgtk-x11-2.0.so.0
#29 0xb7b6a857 in gtk_main_do_event () from /usr/lib/libgtk-x11-2.0.so.0
#30 0xb79f3dda in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#31 0xb7636305 in g_main_context_dispatch () from /lib/libglib-2.0.so.0
#32 0xb7639fe8 in ?? () from /lib/libglib-2.0.so.0
#33 0xb763a527 in g_main_loop_run () from /lib/libglib-2.0.so.0
#34 0xb7b6ae19 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0

Tags: infrom脚本gtksignalmainlibusr
2条回答

在这种情况下,您最好再制作一个Python解释器,并通过将Python片段发送到这个特殊的GTK助手解释器来完成GTK的所有工作。这样,您的C代码就不会直接使用GTK,您只需要担心Python线程之间的协调。在

这看起来像是一个相当长的堆栈,一些被调用的函数看起来是一样的。(例如,g_signal_emit通过g_closure_invoke从自身重复调用。)

在我看来,你可能导致了堆栈溢出,可能是因为你在回调函数中发出了一个处理信号的信号,从而无限递归,直到你用完堆栈空间并崩溃。这只是一个猜测,我对GTK+/GLIB的内部结构了解不多,但我觉得这就是它的味道。我会花钱买的。:-)

如果不是这样,那么GLIB闭包可能被链接得太多(一个回调调用另一个回调调用另一个回调等,直到空间用完为止),也许调整堆栈大小会有所帮助。(我不记得是否有一个简单的方法来完成main(),但如果您要创建一个新线程,pthread_attr_setstacksize()可能会有帮助。)

相关问题 更多 >

    热门问题