Pythonのお勉強 Part22
■ このスレッドは過去ログ倉庫に格納されています
0192デフォルトの名無しさん
2007/12/13(木) 11:23:42/* 独自の 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 が呼ばれるようになるから、あとは
自分でパスを補完するなり独自に取り込むなりすれば良い
■ このスレッドは過去ログ倉庫に格納されています