0

私はPythonを初めて使用します。これが私が抱えている問題です。文字列からモジュールをロードするカスタムフックを使用して、組み込みの._import_をフックしました。

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 

このコードを実行すると、「returnILessons_1(request);」の行に「グローバル名'ajay'が定義されていません」というエラーが表示されます。興味深いのは、Pythonがこの行のすぐ上の行でajayを解決できることです。私はかなり確かに私はexecステートメントでいくつかの間違いを犯していますが、理解することができませんでした。

この問題を解決するのを手伝ってくれませんか。ありがとう

4

1 に答える 1

0

ここでいくつかの問題に注意してください:

1)globalsおよびlocalsは組み込み関数名です。これらを変数名として使用しないでください。

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

次のコードを検討してください ( execステートメントに注意してください)。

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の後に 2 つの引数を持つ exec ) は、ドキュメントで説明されているように機能せず、次のようになります。

NameError: global name 'foo' is not defined

ただし、グローバルとローカルを手動で組み合わせて、それらを exec に渡すこともできます (私の例では、コメントの後の次の文字列)。私には回避策のように見えます。

于 2012-01-23T14:41:29.190 に答える