Python可执行对象——exec、eval、compile

Python提供的调用可执行对象的内建函数进行说明,涉及exec、eval、compile三个函数。exec语句用来执行存储在代码对象、字符串、文件中的Python语句,eval语句用来计算存储在代码对象或字符串中的有效的Python表达式,而compile语句则提供了字节编码的预编译。

当然,需要注意的是,使用exec和eval一定要注意安全性问题,尤其是网络环境中,可能给予他人执行非法语句的机会。

1.exec

格式:exec obj

obj对象可以是字符串(如单一语句、语句块),文件对象,也可以是已经由compile预编译过的代码对象。

下面是相应的例子:

Python可执行对象之exec使用举例

# 单行语句字符串
>>> exec "print 'pythoner.com'"
pythoner.com

#  多行语句字符串
>>> exec """for i in range(5):
...   print "iter time: %d" % i
... """
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4

代码对象的例子放在第3部分一起讲解。

2.eval

格式:eval( obj[, globals=globals(), locals=locals()] )

obj可以是字符串对象或者已经由compile编译过的代码对象。globals和locals是可选的,分别代表了全局和局部名称空间中的对象,其中globals必须是字典,而locals是任意的映射对象。

下面仍然举例说明:

Python可执行对象之eval

>>> x = 7
>>> eval( '3 * x' )
21

3.compile

格式:compile( str, file, type )

compile语句是从type类型(包括’eval‘: 配合eval使用,’single‘: 配合单一语句的exec使用,’exec‘: 配合多语句的exec使用)中将str里面的语句创建成代码对象。file是代码存放的地方,通常为”。

compile语句的目的是提供一次性的字节码编译,就不用在以后的每次调用中重新进行编译了。

还需要注意的是,这里的compile和正则表达式中使用的compile并不相同,尽管用途一样。

下面是相应的举例说明:

Python可执行对象之compile

>>> eval_code = compile( '1+2', '', 'eval')
>>> eval_code
<code object <module> at 0142ABF0, file "", line 1>
>>> eval(eval_code)
3

>>> single_code = compile( 'print "pythoner.com"', '', 'single' )
>>> single_code
<code object <module> at 01C68848, file "", line 1>
>>> exec(single_code)
pythoner.com

>>> exec_code = compile( """for i in range(5):
...   print "iter time: %d" % i""", '', 'exec' )
>>> exec_code
<code object <module> at 01C68968, file "", line 1>
>>> exec(exec_code)
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4

原文地址:https://www.cnblogs.com/xxpythonxx/p/12147027.html

时间: 2024-10-10 19:15:40

Python可执行对象——exec、eval、compile的相关文章

Python可执行对象&mdash;&mdash;exec、eval、compile

       Python提供的调用可执行对象的内建函数进行说明,涉及exec.eval.compile三个函数.exec语句用来执行存储在代码对象.字符串.文件中的Python语句,eval语句用来计算存储在代码对象或字符串中的有效的Python表达式,而compile语句则提供了字节编码的预编译. exec的使用 eval的使用        本函数是用来动态地执行一个表达式的字符串,或者compile函数编译出来的代码对象.参数expression是一个表达式字符串,或者表示编译出来代码对

python 内置函数eval()、exec()、compile()

eval 函数的作用: 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式,而不是复杂的代码逻辑.    eval(source, globals=None, locals=None, /) 参数说明:    source:必选参数,可以是字符串,也可以是一个任意的code(代码)对象实例(可以通过complie函数创建).    如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)python表达式进行分析和解释. global

2015/10/9 Python基础(21):可调用和可执行对象

在Python中有多种运行外部程序的方法,比如,运行操作系统命令或另外的Python脚本,或执行一个磁盘上的文件,或通过网络来运行文件.这完全取决于想要干什么.特定的环境包括: 在当前脚本继续运行 创建和管理子进程 执行外部命令或程序 执行需要输入的命令 通过网络来调用命令 执行命令来创建需要处理的输出 执行其他的Python脚本 执行一系列动态生成的Python语句 导入Python模块 Python中,内建和外部模块都可以提供上述各种功能.程序员得根据实现的需要,从这些模块中选择合适的处理方

内置函数—eval、exec、compile

内置函数----eval.exec.compile eval()将字符串类型的代码执行并返回结果.print(eval('1+2+3+4'))输出:10 exec() 将字符串类型的代码执行.print(exec("1+2+3+4"))exec("print('hello,world')")指定global参数code = '''import os print(os.path.abspath('.'))'''code = '''print(123)a = 20pri

在Python中,val、exec和 compile 有什么区别?

基本上 eval 上用来评估一个动态生成的 Python 表达式:exec 额外的用于执行动态生成的 python 代码. eval 和 exec 有以下两个差异 eval 只接受一个表达式,exec 可以接受一个包含了 python 语句的代码块: loops, try: except:, class 以及定义的函数和方法 Python 中的表达式是任何可以作为变量赋值中的值的表达式: a_variable = (任何你可以放在这个括号内的都是一个表达式) evale 返回表达式的值,而 ex

内置函数——eval、exec、compile

eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec("1+2+3+4")) exec("print('hello,world')")  指定global参数 compile  将字符串类型的代码编译.代码对象能够通过exec语句来执行或者eval()进行求值. 参数说明: 1. 参数source:字符串或者AST(Abstract Syntax Trees)对象.即

内置函数---eval、exec、compile

eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec("1+2+3+4")) exec("print('hello,world')") code = ''' import os print(os.path.abspath('.')) ''' code = ''' print(123) a = 20 print(a) ''' a = 10 exec(code,{'pri

python exec eval

exec语句用来执行储存在字符串或文件中的Python语句 exec 'print "Hello World"'Hello World eval语句用来计算存储在字符串中的有效Python表达式.下面是一个简单的例子 eval_r('3+4')7

Python标准库 内置函数compile source filename mode flags 0 dont

这个函数用来编译一段字符串的源码,结果可以生成字节码或者AST(抽像语法树),字节码可以使用函数exec()来执行,而AST可以使用eval()来继续编译. 参数source是一串字符串的源码,或者是AST对象数组. 参数filename是读取字符串的文件对象,如果不是从文件里读取源码来编译,那么这里可以放一些用来标识这些代码的字符串. 参数mode是用来指明那种表示的源码类型:如果是exec类型,表示这是一个序列语句,可以进行运行:如果是eval类型,表示这是一个单一的表达式语句,可以用来计算