Dynamic Module loading scope in Python
When I run the following sample:
def a():
    exec('import math')
    b()
def b():
    print math.cos(90)
a()
I get the following error: NameError: global name 'math' is not defined
What I am trying to do is to dynamically load some modules from within the a() function and use them in function b()
I want it to be as seamless as possible fo开发者_运维知识库r the b()'s point of view. That means, I don't want to load the module with _ _ import _ _ in a() and pass a reference to the b() function, in fact it is mandatory that the b()'s function signature remains just this: b()
is there any way to do this guys? thanks!
Upon comments on the post: if want to load modules runtime, load where you need it:
def b():
  m = __import__("math")
  return m.abs(-1)
Answering to your question:
def a():
  if not globals().has_key('math'):
    globals()['math'] = __import__('math')
def b():
  """returns the absolute value of -1, a() must be called before to load necessary modules"""
  return math.abs(-1)
One approach for Python 2.x would be:
def a():
    exec 'import math' in globals()
    b()
def b():
    print math.cos(90)
a()
But I would generally recommend using __import__().  I don't know what you are actually trying to achieve, but maybe this works for you:
def a():
    global hurz
    hurz = __import__("math")
    b()
def b():
    print hurz.cos(90)
a()
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论