我正在尝试开发一个嵌入一个或多个Python解释器的基于C的应用程序。我在C-parts中使用gtk-things,并在其中逻辑调用gtk_main()。
Python解释器是使用Py_NewInterpreter()在单独的pthread中创建的,并且基本上是永远运行的(如果脚本终止,则将'而真正的'循环添加到末尾)。
现在我想在这些脚本中使用pyGTK,这似乎有效,直到有回调(发出信号)。您可以注册信号处理程序以指向Python脚本中的部件,但似乎gtk主循环在它们发生时无法正确引导它们,从而导致像下面的日志那样的段错误。
我猜测它可能与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
答案 0 :(得分:0)
通过将Python片段发送到特殊的GTK帮助解释器,您最好再制作一个Python解释器并完成所有GTK工作。这样你的C代码就不会直接使用GTK,你只需要担心Python线程之间的协调。
答案 1 :(得分:0)
这看起来像一个很长的堆栈,并且一些被调用的函数看起来相同。 (例如,通过g_signal_emit
从自身重复调用g_closure_invoke
。)
在我看来,你可能会导致堆栈溢出,可能是通过在回调中发出处理信号的信号,从而无限地递归,直到你的堆栈空间用尽并崩溃。这只是一个猜测,我不太了解GTK + / GLIB内部结构,但这就是它对我来说的味道。我会把钱放在上面。 : - )
如果不是这样,那么可能GLIB闭包被链接太多(一个回调调用另一个回调,调用另一个等等,直到你的空间不足。)也许调整你的堆栈大小会有所帮助。 (我不记得是否有一种简单的方法可以为main()
执行此操作,但如果您正在创建新的帖子pthread_attr_setstacksize()
可能会有所帮助。)