1

好的,我正在尝试对 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 中运行良好,但任何想法或建议都会非常感谢我。

4

3 回答 3

2

如果你只想重新加载一个模块,你可以这样做

from imp import reload
reload(sys)
于 2013-07-15T06:48:41.097 回答
2

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

示例深入 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'>
于 2013-07-15T06:50:42.603 回答
1

exec如果否localsglobals通过,则在当前范围内执行。因此,您将模块import sys导入范围。见代码:sysimporting

>>> 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__.

于 2013-07-15T07:42:35.773 回答