强制从另一个模块中的函数导入

时间:2013-07-15 06:45:38

标签: python

好吧我正在尝试用python版本3.3.2做某事我正在尝试导入模块,所以我不必重新启动shell。以下只是最终代码可以更改的示例:

def importing():
    x = compile('import sys',"<string","exec")
    exec(x)
    return True

问题在于,当我使用test.importing()调用它时,它返回True但是当我执行sys时它会说:

 Traceback (most recent call last):
  File "<pyshell#74>", line 1, in <module>
    sys
NameError: name 'sys' is not defined

令我感到困惑的是,尽管它在shell中运行得非常好,但任何想法或建议都会非常感谢我。

3 个答案:

答案 0 :(得分:2)

如果您只想重新加载模块,可以

from imp import reload
reload(sys)

答案 1 :(得分:2)

如果要动态导入模块,可以使用__import__

示例Dive into Python

>>> sys = __import__('sys')           
>>> os = __import__('os')
>>> re = __import__('re')
>>> unittest = __import__('unittest')
>>> sys                               
>>> <module 'sys' (built-in)>
>>> os
>>> <module 'os' from '/usr/local/lib/python2.2/os.pyc'>

答案 2 :(得分:1)

exec如果没有localsglobals通过,则会在当前范围内执行。因此,您的import sys导入了sys范围内的importing模块。见代码:

>>> def c():
...     exec('import sys')
...     print(locals())
...     print(globals())
... 
>>> c()
{'sys': <module 'sys' (built-in)>}
{'__builtins__': <module 'builtins'>, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, 'c': <function c at 0x7faa068e0320>, 'b': <function b at 0x7faa068e45f0>, 'a': <function a at 0x7faa066abe60>, 'd': <function d at 0x7faa068f6200>, 'inspect': <module 'inspect' from '/usr/lib64/python3.3/inspect.py'>, '__doc__': None}

请参阅sys在本地范围内,但不在全局范围内。但请注意,导入是动态执行的,即使它在本地范围内,也不能直接在函数中调用sys。调用最终会出错,无法在全局范围内找到sys:

>>> def a():
...     exec('import sys')
...     if sys:
...             return True
...     else:   
...             return False
... 
>>> a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in a
NameError: global name 'sys' is not defined

相反,您应该使用locals()

>>> def b():
...     exec('import sys')
...     if locals()['sys']:
...             return True
...     else:
...             return False
... 
>>> b()
True

最后,我认为使用exec不是一个好选择。就像其他人提到的一样,使用__importing__