2

私はOSXLionを実行していて、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;
    }

goocanvaspythonモジュールのC++コードがを介して「cairo」ライブラリをインポートしようとすると、セグメンテーション違反が発生することを発見しましたPyCObject_Import("cairo", "CAPI")。ただし、を介してpython2.7コンソールから直接cairoモジュールをインポートしようとするとimport cairo、機能します。

どうすればいいですか?私はブラインドセグメンテーション違反があり、なぜそれが起こるのか分かりません。python goocanvasモジュールをコンパイルできたことを思い出してください。ただし、pythonにインポートしようとするとsegfaultが発生します。

4

1 に答える 1

1

どのようなコンソールを使用していますか? gtk/glib には、メインループを REPL と同時に実行できるようにするフックがいくつかあると思います。これはスレッドが使用中であることを意味し、glib.threads_init() が呼び出されなかった場合にクラッシュを引き起こす可能性があります。

私見、これは設計上壊れています.glibまたはg *モジュールをインポートするだけで、スレッドを使用する正常なPythonプログラムが突然segfaultを開始するためです。スレッド化のサポートがデフォルトである必要があります。

私たちの場合、クラッシュは GIL を保持せずに Python に転送された glib のロギング システムによって引き起こされました。

于 2013-04-17T13:15:42.547 に答える