'PyCObject_Import(“cairo”,“CAPI”)“C++调用产生段错误,”import Cai

'PyCObject_Import("cairo", "CAPI")' C++ call yields segfault, 'import cairo' on python works

本文关键字:段错误 错误 Cai import 调用 C++ cairo PyCObject CAPI Import      更新时间:2023-10-16

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

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

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 控制台直接导入开罗模块 import cairo ,它可以工作。

我应该怎么做?我有一个盲目的 seg 错误,不知道为什么会发生这种情况。记得我设法编译了python goocanvas模块,但是在尝试将其导入python时出现段错误。

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

恕我直言,这是设计破坏的,因为通过仅导入 glib 或任何 g* 模块,使用任何线程的理智 Python 程序将突然开始段错误。支持线程应该是默认值。

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