为什么我可以从'eval'调用'print'

Tie*_*dil 7 python printing import eval built-in

代码:

#!/usr/bin/python

src = """
print '!!!'
import os
"""

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': False})
Run Code Online (Sandbox Code Playgroud)

我得到输出:

!!!
Traceback (most recent call last):
  File "./test.py", line 9, in <module>
    eval(obj, {'__builtins__': False})
  File "", line 3, in <module>

ImportError: __import__ not found
Run Code Online (Sandbox Code Playgroud)

'print'和'import'都是语言结构.为什么'eval'限制使用'import'但不限制'print'?

PS我正在使用python 2.6

更新:问题不是"为什么导入不起作用?" 但"为什么印刷工作?" 是否有一些架构限制或其他?

Sac*_*cha 7

__import__方法由import关键字: python.org调用

如果您希望能够导入模块,则需要将__import__方法保留在内置函数中:

src = """
print '!!!'
import os
"""

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': {'__import__':__builtins__.__import__}})
Run Code Online (Sandbox Code Playgroud)