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

时间:2010-10-16 16:30:47

标签: python printing import eval built-in

代码:

#!/usr/bin/python

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

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': False})

我得到输出:

!!!
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

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

P.S。我正在使用python 2.6

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

4 个答案:

答案 0 :(得分:7)

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

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

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

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': {'__import__':__builtins__.__import__}})

答案 1 :(得分:2)

eval中,import的来电已成功,但import使用了您在{{1}中无法使用的内置的__import__方法}。这就是你看到

的原因
exec

ImportError: __import__ not found 不依赖于任何内置函数,所以工作正常。

您可以通过以下内容传递内置print

__import__

答案 2 :(得分:0)

打印有效,因为您为'exec'函数调用指定了compile

答案 3 :(得分:0)

import调用global / builtin __import__函数;如果没有找到,import失败。

print不依赖任何全局变量来完成它的工作。这就是为什么print适用于您的示例,即使您没有使用可用的__builtins__