2

我正在运行 OSX Lion 并尝试使用 python2.7为goocanvas导入 python 模块。

我设法成功编译了 pygoocanvas-0.14.1,但是当我尝试import goocanvas通过 python2.7 控制台时,我得到了一个段错误。经过一些调试,我被引导到这段代码:

DL_EXPORT (void)
initgoocanvas (void)
{
    PyObject *m, *d;
    fprintf(stderr,"init<< \n");

//    Pycairo_IMPORT; // XXX removed, it expands to the line below, anyways
    Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import("cairo", "CAPI"); // ADDED XXX

    fprintf(stderr,"after import<< \n");
    if (Pycairo_CAPI == NULL) {
        return;
    }

我发现当 goocanvas python 模块的 C++ 代码尝试通过PyCObject_Import("cairo", "CAPI"). 但是,如果我尝试通过 python2.7 控制台直接导入 cairo 模块import cairo,它可以工作。

我应该如何进行?我有一个盲目的段错误,不知道为什么会发生。记住我设法编译了 python goocanvas 模块,但是在尝试将它导入 python 时它会出现段错误。

4

1 回答 1

1

你使用什么样的控制台?我认为 gtk/glib 有一些钩子可以让主循环与 REPL 同时运行。这意味着线程正在使用中,如果未调用 glib.threads_init() 可能会导致崩溃。

恕我直言,这在设计上被破坏了,因为只需导入 glib 或任何 g* 模块,一个使用任何线程的理智 Python 程序就会突然开始出现段错误。支持线程应该是默认设置。

在我们的例子中,崩溃是由 glib 的日志系统引起的,该系统在没有保存 GIL 的情况下被转发到 Python。

于 2013-04-17T13:15:42.547 回答