为什么我可以调用“打印”?来自“评估”

发布于 2024-09-28 10:05:33 字数 540 浏览 5 评论 0原文

对于代码:

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

“打印”和“导入”都是语言构造。为什么“eval”限制使用“import”但不限制“print”?

PS 我正在使用 python 2.6

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

For code:

#!/usr/bin/python

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

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

I get output:

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

Both 'print' and 'import' are language construct. Why does 'eval' restrict using of 'import' but doesn't restrict 'print'?

P.S. I'm using python 2.6

UPDATE: Question is not "Why does import not work?" but "Why does print work?" Are there some architecture restrictions or something else?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

猫腻 2024-10-05 10:05:33

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

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

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

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

The __import__ method is invoked by the import keyword: python.org

If you want to be able to import a module you need to leave the __import__ method in the builtins:

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

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': {'__import__':__builtins__.__import__}})
赤濁 2024-10-05 10:05:33

在您的 eval 中,对 import 的调用已成功完成,但是 import 使用了内置函数中的 __import__ 方法,您可以在已在您的 exec 中变得不可用。这就是为什么您看到

ImportError: __import__ not found

print 不依赖于任何内置函数所以工作正常的原因。

您可以从内置函数中仅传递 __import__ ,如下所示:

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

In your eval the call to import is made successfully however import makes use of the __import__ method in builtins which you have made unavailable in your exec. This is the reason why you are seeing

ImportError: __import__ not found

print doesn't depend on any builtins so works OK.

You could pass just __import__ from builtins with something like:

eval(obj, {'__builtins__' : {'__import__' :__builtins__.__import__}})
暖阳 2024-10-05 10:05:33

print 之所以有效,是因为您在 compile 函数调用中指定了 'exec'

print works because you specified 'exec' to the compile function call.

拥抱没勇气 2024-10-05 10:05:33

import 调用全局/内置的 __import__ 函数;如果找不到,导入就会失败。

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

import calls the global/builtin __import__ function; if there isn't one to be found, import fails.

print does not rely on any globals to do its work. That is why print works in your example, even though you do not use the available __builtins__.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文