代码:
#!/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
更新:问题不是“为什么导入不起作用?”但“为什么印刷工作?”是否有一些架构限制或其他什么?
答案 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__
。