- 192 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 11:23:42 ]
- >>181
/* 独自の import 関数を定義する */ PyObject* MyImport(const char* name, PyObject* globals, PyObject* locals, PyObject* fromlist) { /* 最初に標準でのインポートをこころみる */ PyObject* module = PyImport_ImportModuleEx(name, globals, locals, fromlist); if (module && PyModule_Check(module)) return module; PyErr_Clear(); /* Import エラーを破棄 */ Py_XDECREF(module); /* 標準インポートに失敗した時だけ独自インポートを試みる */ module = 独自にインポートするか、パスを変えてもう一度 PyImport_ImportModuleEx を呼び出す return module; } この API を、例えば "my" モジュールの "importhook" という名前で登録しておく. そして、__builtins__['__import__'] を my.importhook で置き換えるようなコードを書く const char* pysource = "\n\ def replace_import():\n\ import my\n\ __builtins__['__import__'] = my.importhook\n" これを Py_CompileString でコードオブジェクト化してから PyObject_GetAttrString で replace_import 関数オブジェクトを取り出し、PyObject_CallFunction で実行する。 もしかしたら PyRun_String でそのまま実行してOKかもしれんけど、その場合は globals 引数を 適切に設定しないとダメだと思う。 とりあえず、これで import を実行する度に MyImport が呼ばれるようになるから、あとは 自分でパスを補完するなり独自に取り込むなりすれば良い
|

|