Python 为什么我可以打电话给';打印';从';评估';

Python 为什么我可以打电话给';打印';从';评估';,python,printing,import,eval,built-in,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__':

代码:

#!/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
!!!
回溯(最近一次呼叫最后一次):
文件“/test.py”,第9行,在
eval(obj,{“内置”:False})
文件“”,第3行,在
导入错误:\未找到导入
“打印”和“导入”都是语言结构。为什么“eval”限制使用“import”而不限制“print”

另外,我正在使用python 2.6


更新:问题不是“为什么导入不起作用?”而是“为什么打印起作用?”是否存在一些架构限制或其他问题?

评估中,调用
导入
是成功的,但是
导入
使用了内置的
导入
方法,而您在
执行
中没有该方法。这就是为什么你会看到

ImportError: __import__ not found
打印
不依赖于任何内置,因此工作正常

您可以使用以下内容从内置程序中传递
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

eval(obj, {'__builtins__' : {'__import__' :__builtins__.__import__}})

import
方法由
import
关键字调用:


如果希望能够导入模块,则需要将
\uuuu import\uuu
方法保留在内置项中:

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

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

打印之所以有效,是因为您将
'exec'
指定给了
编译
函数调用。

导入
调用全局/内置的
导入
函数;如果找不到,导入将失败


print
不依赖任何全局文件来完成其工作。这就是为什么在您的示例中,
print
可以工作的原因,即使您没有使用可用的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu

Ok,但是为什么一个简单语句(如文档中所述:)具有适当的内置方法,而另一个没有?这个(体系结构?)解决方案有实际意义吗?
\uuuuuuuuuuuuuu导入
方法存在,因此,例如,您可以替换它并更改
导入
的语义。不过,最好使用导入挂钩来实现这一点。请参见Python3.x中的
print
已被
print()
内置方法替换,因此您将看到3.x中的print具有相同的行为。问题不是“为什么导入不起作用?”而是“为什么打印起作用?”print在Python3K中成为一种方法,我打赌它将不再起作用:)