7

对于代码:

#!/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'?

PS我正在使用python 2.6

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

4

4 回答 4

7

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

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

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

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': {'__import__':__builtins__.__import__}})
于 2010-10-16T16:53:23.910 回答
2

在您eval的调用中import成功地import使用了__import__您在exec. 这就是你看到的原因

ImportError: __import__ not found

print不依赖于任何内置函数,因此可以正常工作。

您可以__import__仅从内置函数传递,例如:

eval(obj, {'__builtins__' : {'__import__' :__builtins__.__import__}})
于 2010-10-16T16:52:19.000 回答
0

import调用全局/内置__import__函数;如果找不到,则import失败。

print不依赖任何全局变量来完成其工作。这就是为什么print在您的示例中有效,即使您不使用可用的__builtins__.

于 2010-10-17T20:21:55.733 回答
0

print 有效,因为您指定'exec'compile函数调用。

于 2010-10-16T17:22:32.110 回答