Pythonのお勉強 Part22
at TECH
192:デフォルトの名無しさん
07/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 が呼ばれるようになるから、あとは
自分でパスを補完するなり独自に取り込むなりすれば良い
次ページ続きを表示1を表示最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5501日前に更新/217 KB
担当:undef