好吧我正在尝试用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中运行得非常好,但任何想法或建议都会非常感谢我。
答案 0 :(得分:2)
如果您只想重新加载模块,可以
from imp import reload
reload(sys)
答案 1 :(得分:2)
如果要动态导入模块,可以使用__import__
。
>>> 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
如果没有locals
和globals
通过,则会在当前范围内执行。因此,您的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__
。