【发布时间】:2015-07-03 16:52:56
【问题描述】:
如果你运行这段代码:
src = "import os"
d = dict(__builtins__={})
exec src in d
Python 说:
ImportError: __import__ not found
这就是我喜欢做的事情,但是在创建(或加载)新模块时:
import imp
mod = imp.new_module("foo")
src = "import os"
exec src in mod.__dict__
你可以看到它运行,但我喜欢它不像上面的程序那样。我喜欢禁用所有内置变量和函数。有没有办法做到这一点?
如果您打印mod.__dict__,您可以看到它具有__builtins__ 变量,例如任何Python 模块。我想我必须将其值更改为{},但我不知道如何。
【问题讨论】:
-
所以您想“禁用所有内置变量和函数”,但不是真的全部?你在做什么似乎有点像黑客。是什么导致您有这种需求?
-
听起来您想以某种方式在“安全”环境中运行任意字符串。鉴于您可以使用 os 模块执行诸如打开文件之类的操作,而无需访问 open 内置命令,您应该更清楚自己想要什么。
-
我喜欢创建一个带有受限 builtins 全局常量和函数的模块(但只是在这个模块中),类似于第一个代码(如果你将 src 更改为“sum( [2, 4])" 这也是一个错误,因为 python 不知道如何执行它)。
-
是的,但是为什么?如果@CrazyCasta 是正确的并且您正在尝试进行沙盒,请参见例如programmers.stackexchange.com/q/191623/110531
-
他似乎试图在受限环境中执行某些操作。显然 python-exec 标记匹配,并且鉴于限制没有描述,我并没有真正看到问题。
标签: python python-exec