Python沙箱中exec禁用__builtins__后调用datetime.strftime报错
问题解决与执行流程解释
修复strftime执行报错的代码
当你把exec的__builtins__设为None时,datetime.strftime内部执行需要调用__import__来加载_locale模块(用于日期格式化的本地化处理),但此时命名空间里找不到__import__,所以触发KeyError。
解决方法是在exec的全局命名空间中,给__builtins__提供必要的__import__函数,同时按需传入其他需要的对象(比如datetime模块、print函数):
import datetime # 只提供需要的内置对象,保证安全性的同时满足需求 allowed_builtins = { "__import__": __import__, "print": print } restricted_code = """ dt = datetime.datetime.now() print(dt.strftime("%Y-%m-%d")) """ # 传入受限的内置集合和需要的模块 exec(restricted_code, {"__builtins__": allowed_builtins, "datetime": datetime})
这样修改后,strftime就能正常调用__import__加载依赖模块,完成日期格式化。
object.method()的完整执行流程
以dt.strftime("%Y-%m-%d")为例,Python执行这个调用的完整步骤如下:
- 属性查找:
- 首先在
dt这个datetime实例的属性中查找strftime,找不到就去它的类datetime.datetime中查找; - 如果类里也没有,就沿着继承链(比如
datetime.datetime的父类object)继续查找,直到找到目标方法或抛出AttributeError。
- 首先在
- 绑定方法:
- 找到
strftime方法后,Python会自动把实例dt绑定到方法的第一个参数(通常是self)上,生成一个绑定方法对象。这就是为什么调用实例方法时不需要手动传入self。
- 找到
- 执行方法:
- 调用绑定后的方法,把你传入的
"%Y-%m-%d"作为第二个参数传递进去,执行方法内部的代码逻辑。 - 这里
strftime内部会调用__import__加载_locale模块来处理格式化规则,这也是之前__builtins__为None时报错的核心原因——缺少必要的导入函数。
- 调用绑定后的方法,把你传入的
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

