说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置函数 exec() 可执行储存在字符串或文件中的 Python语句,相比于 eval,exec 可以执行更复杂的 Python 代码。exec 返回值永远为 None,除非你打印返回值。它是 Python 留给用户的一个接口。
exec() 可以执行复杂的字符串:
exec('a=1\nb=1\nprint(a+b)')
# 2
exec('n=2+2')
n
# 4
由于 exec() 执行代码返回 None,所有想查看结果需要 print() 来输出。
语法为:
exec(source, globals=None, locals=None, /)
在全局 globals() 和局部 locals() 命名空间的上下文中计算执行给定的 source 字符串表达式,返回值永远为 None。
source 可以是表示Python表达式的字符串,也可以是 compile() 返回的代码对象。
全局变量 globals 必须是字典,局部变量 locals 可以是任何映射类型,默认为当前全局变量和局部变量。
如果只提供 globals,则 locals 默认也是它。
此函数支持Python代码的动态执行。对象必须是字符串或代码对象。如果它是一个字符串,该字符串将被解析为一组 Python 语句,然后执行(除非出现语法错误)。如果它是一个代码对象,则只需执行它。在所有情况下,执行的代码都应作为文件输入有效(请参阅第节)文件输入 在参考手册中)。请注意,nonlocal、yield 和 return 语句不能在函数定义之外使用,甚至不能在传递给 exec() 函数的代码上下文中使用。返回值为 None。
解析器只接受 Unix 风格的行结束符。如果您从文件中读取代码,请确保用换行符转换模式转换 Windows 或 Mac 风格的换行符。
无论在什么情况下,如果省略了可选部分,代码将运行于当前作用域中。如果只提供了 globals,则必须为字典对象(而不能是字典的子类),同时用于存放全局变量和局部变量。如果提供了 globals 和 locals,则将分别用于全局变量和局部变量。locals 可以是任意字典映射对象。请记住,在模块级别,globals 和 locals 是同一个字典。如果 exec 获得两个独立的对象作为 globals 和 locals,代码执行起来就像嵌入到某个类定义中一样。
如果 globals 字典不包含 __builtins__
键值,则将为该键插入对内建 builtins 模块字典的引用。因此,在将执行的代码传递给 exec() 之前,可以通过将自己的 __builtins__
字典插入到 globals 中来控制可以使用哪些内置代码。
如果出现错误将引发一个 审计事件 exec 附带参数 code_object。
注意:
需要注意的是,exec() 执行代码,不返回任何值(返回 None)。因此,不能在函数定义之外使用 return 和 yield 语句。
关于使用风险可以参考 eval() 执行字符串表达式中的相关风险介绍,在使用时要格外注意。
更新时间:2022-04-05 21:16:29 标签:python 执行 代码