Python 中的 exec() 函数


Exec 函数可以动态执行 Python 程序的代码。代码可以作为字符串或对象代码传递给此函数。对象代码按原样执行,而字符串则首先被解析并检查是否存在任何语法错误。如果没有语法错误,则解析后的字符串将作为 Python 语句执行。

exec() 函数的语法

exec(object, globals, locals)

其中

  • 对象 − 传递给方法的字符串或代码对象。

  • globals − 可用的全局方法和变量的字典。

  • locals − 可用的局部方法和变量的字典。

传递字符串

在下面的示例中,我们将一行代码作为字符串传递给 exec() 函数。它被解析并执行以给出输出。

x = 9
exec ('print(5*x)')

输出

运行以上代码将给出以下结果:

45

传递代码对象

现在我们来看看如何传递包含多个代码语句的代码块。因为它是一个代码对象,所以它会直接执行并给出结果。请注意我们如何使用 \n 和空格来创建一个具有正确缩进的 Python 代码块。

示例

prog_block = 'x = 3 \nif(x < 5): \n print x*x'
exec(prog_block)

输出

运行以上代码将给出以下结果:

9

无全局和局部参数

当我们不为全局和局部参数传递任何值时,我们将根据导入到程序中的包获得默认可用的函数。在下面的示例中,我们看到当全局和局部参数值都被跳过时,代码为我们提供了所有可用的函数。

from time import *
exec("print(dir())")

运行以上代码将给出以下结果:

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', 
'__package__', '_dh', '_exit_code', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15',
 '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'clock', 
'copysign', 'cos', 'cosh', 'ctime', 'daylight', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 
'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'get_ipython', 'gmtime', 'hypot', 
'isinf', 'isnan', 'ldexp', 'lgamma', 'localtime', 'log', 'log10', 'log1p', 'mktime', 'modf', 'pi', 
'pow', 'prog', 'prog_block', 'quit', 'radians', 'sin', 'sinh', 'sleep', 'sqrt', 'strftime', 'strptime', 
'struct_time', 'tan', 'tanh', 'time', 'timezone', 'trunc', 'tzname', 'x']

使用全局参数应用限制

我们可以通过传递一个空字典作为全局参数来限制对导入模块中任何函数的访问。在这种情况下,结果将仅显示内置函数,而不会显示导入模块中的任何函数。这就是我们如何限制并使函数更安全的方法。

示例

 在线演示

from time import *
exec("print(dir())",{})

输出

运行以上代码将给出以下结果:

['__builtins__']

仅允许选定的函数

接下来,我们看看如何仅将从导入模块中选择的特定函数应用于 exec() 方法。在下面的示例中,我们只允许所需的函数作为全局选项的参数。localtime() 函数是程序中导入的 time 模块的一部分。示例

 在线演示

from time import *
exec("print lclt()",{"lclt":localtime})

输出

运行以上代码将给出以下结果:

time.struct_time(tm_year=2019, tm_mon=7, tm_mday=19, tm_hour=12, tm_min=33, tm_sec=53, tm_wday=4, tm_yday=200, tm_isdst=0)

传递局部参数

我们还可以通过使用局部参数并完全排除内置函数来限制对从导入模块中各种函数的使用。在下面的示例中,我们选择 None 作为内置全局参数的值。

示例

 在线演示

from time import *
exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})

运行以上代码将给出以下结果:

['dir', 'gtime', 'print']

更新于:2019年8月23日

1K+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.