« ubuntu 9.04でBlender | トップページ | MMDは素晴らしい »

ubuntu 9.04でBlender(その2)

前回はPython2.6のモジュール__init__.pyを書き換えることで対応しましたが、今回はBlenderのソースを修正することで対応する方法について。
encodesモジュールをimportしたときにエラーになるのは、Blender側のメソッドがキーワード引数の形式に対応していないのが原因ですので、BlenderのPythonインターフェース部分のソースを修正することにします。

エラーメッセージに出てくる「blimport()」はsource/blender/python/BPY_interface.cの中でblender_import()にマップされています。

static PyMethodDef bimport[] = {
    {"
blimport", blender_import, METH_VARARGS, "our own import"}
};

キーワード引数を使う場合、METH_VARARGSに加えてMETH_KEYWORDS指定が必要となります。

     {"blimport", (PyCFunction)blender_import, METH_VARARGS|METH_KEYWORDS, "our own import"},
     {NULL, NULL}    /* sentinel */

METH_KEYWORDSは第3引数にキーワードの辞書が渡されますので、blender_importの引数にkeywdsを追加します。170行目で定義されている関数プロトタイプも同様に変更しておきます。

static PyObject *blender_import( PyObject * self, PyObject * args, PyObject *keywds )

受け取るキーワードと順序をkwlist[]に作成しておきます。

static char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", NULL};

引数の解析関数PyArg_ParseTupleをPyArg_ParseTupleAndKeywordsに変更します。

if( !PyArg_ParseTupleAndKeywords( args, keywds, "s|OOOi:bimport", kwlist,
               &name, &globals, &locals, &fromlist, &dummy_val) )

以上の変更で、キーワード引数に対応することができます。

static PyMethodDef bimport[] = {
    {"blimport", (PyCFunction)blender_import, METH_VARARGS|METH_KEYWORDS, "our own import"},
    {NULL, NULL}    /* sentinel */
};

static PyObject *blender_import( PyObject * self, PyObject * args, PyObject *keywds )
{
    PyObject *exception, *err, *tb;
    char *name;
    PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
    PyObject *m;
    //PyObject_Print(args, stderr, 0);
#if (PY_VERSION_HEX >= 0x02060000)
    int dummy_val; /* what does this do?*/
    static char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", NULL};
   
    if( !PyArg_ParseTupleAndKeywords( args, keywds, "s|OOOi:bimport", kwlist,
                   &name, &globals, &locals, &fromlist, &dummy_val) )
        return NULL;
#else
    static char *kwlist[] = {"name", "globals", "locals", "fromlist", NULL};
    if( !PyArg_ParseTupleAndKeywords( args, keywds, "s|OOO:bimport", kwlist,
                   &name, &globals, &locals, &fromlist ) )
        return NULL;
#endif

最終的にはこんな感じのソースになります。
あとは普通にコンパイルしてインストールすればencodesモジュールをimportしてもエラーは出なくなります。

今回の修正のパッチファイルは↓です。

ダウンロード BPY_interface.c.patch (2.3K)

|

« ubuntu 9.04でBlender | トップページ | MMDは素晴らしい »

Blender」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1222561/29798938

この記事へのトラックバック一覧です: ubuntu 9.04でBlender(その2):

« ubuntu 9.04でBlender | トップページ | MMDは素晴らしい »