2012-01-23 16 views
0

私は非常にPythonの新機能です。ここに問題があります。 ビルトイン ._ _私のカスタムフックでは、文字列からモジュールを読み込みます。動的にロードされたモジュールで定義された関数が見つかりません

def import_hook(name, globals=None, locals=None, fromlist=None): 
    if name in sys.modules: 
      obj = sys.modules[name] 
      return obj 
    #Make sure we hook only for modules which start with ajay  
    if name.startswith("ajay"): 
     statement = ''' 
print 'inside the ajay module' 
def ajay_func(): 
    print 'inside the func' 
''' 
     mod = imp.new_module(name) 
     mod.__file__ = name 
     compiled = compile(statement, '<string>', 'exec') 
     exec compiled in mod.__dict__ 
     sys.modules[name] = mod 
     return mod 

    return original_import(name, globals, locals, fromlist) 

次に、モジュールをロードしてその関数をexec文で呼び出す関数でこのフックを使用します。私はエラーを取得、このコードを実行すると

original_import = __builtin__.__import__ 
def test(request): 
    statement = ''' 
import sys 
import ajay 
def ILessons_1(request): 
    ajay.ajay_func() 
''' 
    try: 
     __builtin__.__import__ = import_hook 
     compiled = compile(statement, '<string>', 'exec') 
     exec (compiled, globals(), locals()) #in statement_module.__dict__ 
     ajay.ajay_func() 
     return ILessons_1(request); 
    finally: 
     __builtin__.__import__ = original_import 
     pass 

が一列に「グローバル名 『アジャイ』が定義されていない」「ILessons_1(リクエスト)を返します。」。興味深いことに、pythonはこの行のすぐ上の行でajayを解決できます。私はかなり間違っていますが、私はexecのステートメントで間違いを犯していますが、理解できていません。

この問題を解決するのに役立つものがありますか? おかげ

答えて

0

はここにいくつかの問題を指摘した:

1)globalslocalsは組み込み関数の名前である、あなたは、変数名としてそれらを使用しないでください。

2)おそらくバグですか? (Ubuntuの下のpython 2.7.1でテスト済み)

コード(のexec文を注意してください)、次の点を考慮:ここでコメントした文字列(で後の2つの引数を持つ幹部が)として動作しません

def outer_function(): 
    foo = "foobar" 
    statement = ''' 
def inner_function(): 
    print foo 
''' 
    #exec statement in globals(), locals() 
    exec statement in globals().update(locals()) 
    inner_function() 

outer_function() 

in the documentationで説明したとの結果:

NameError: global name 'foo' is not defined 

しかし、一つには、手動で地元の人々は、私の例ではコメントの後(次の文字列をexecしするためにそれらを渡す+グローバルを組み合わせることができます)。私の回避策のように見えます。

関連する問題