2012-01-23 115 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。林相當肯定我在執行語句中犯了一些錯誤,但一直無法弄清楚。

有些請幫我解決這個問題。 感謝

回答

0

這裏注意到幾個問題:

1)globalslocals是內置的函數名,你不應該使用它們作爲變量名。

2)可能是一個錯誤? (與Python 2.7.1測試在Ubuntu下)

考慮下面的代碼(注意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() 

這裏評論的字符串(EXEC在後2個參數)將無法正常工作在in the documentation描述,並導致:

NameError: global name 'foo' is not defined 

但一個可以手動合併全局+當地人的在我的例子評論之後將它們傳遞給exec(下一個字符串)。看起來像我的解決方法。

相關問題