[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 13:11 / Filesize : 217 KB / Number-of Response : 937
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Pythonのお勉強 Part22



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 が呼ばれるようになるから、あとは
自分でパスを補完するなり独自に取り込むなりすれば良い






[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<217KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef