【问题标题】:How to change __builtins__ module variable?如何更改 __builtins__ 模块变量?
【发布时间】: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


【解决方案1】:

我想我必须将其值更改为 {},但我不知道如何。

mod.__dict__["__builtins__"] = {}

【讨论】:

  • 如果你使用这个和 RestrictedPython,你可以控制代码中最不安全的行(我不确定是否全部)。
猜你喜欢
  • 2011-04-01
  • 2014-08-18
  • 2012-08-27
  • 2016-04-08
  • 2016-11-07
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多