exec
语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec
语句执行这些语句。下面是一个简单的例子。
>>> exec 'print "Hello World"'
Hello World
eval
语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。
>>> eval_r('2*3')
6
eval_r(str [ globals [ locals ]])函数将字符串str当成有效python表达式来求值,并返回计算结果。
同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同.
最后,execfile(filename [,globals [,locals ]])函数可以用来执行一个文件,看下面的例子:
>>> eval_r('3+4')
7
>>> exec 'a=100'
>>> a
100
>>> execfile(r'd:\code\ex\test.py')
hello world!
>>>
默认的,eval_r(),exec,execfile()所运行的代码都位于当前的名字空间中. eval_r(), exec 和 execfile()函数也可以接受一个或两个可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:
1 globals = { 'x': 7,
2 'y': 10,
3 'birds': ['Parrot', 'Swallow', 'Albatross']
4}
5 locals = { }
6
7 # 将上边的字典作为全局和局部名称空间
8 a = eval("3*x + 4*y", globals, locals)
9 exec "for b in birds: print b" in globals, locals # 注意这里的语法
10 execfile("foo.py", globals, locals)
如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用.如果一个函数体内嵌嵌套函数或lambda匿名函数时,同时又在函数主体中使用exec或execfile()函数时, 由于牵到嵌套作用域,会引发一个SyntaxError异常.(此段原文:If you omit one or both namespaces, the current values of the global and local namespaces are used. Also,due to issues related to nested scopes, the use of exec or execfile() inside a function body may result in a
在Python2.4中俺未发现可以引起异常
注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个语句(就象print或while), 而eval_r()和execfile()则是内建函数.
exec(str) 这种形式也被接受,但是它没有返回值。
当一个字符串被exec,eval_r(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。
compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串, filename是定义该字符串变量的文件,kind参数指定了代码被编译的类型-- 'single'指单个语句, 'exec'指多个语句, 'eval'指一个表达式. cmpile()函数返回一个代码对象,该对象当然也可以被传递给eval_r()函数和exec语句来执行,例如:
>>> str = 'for i in range(0, 10): print i'
>>> c = compile(str,'','exec') # 编译为字节代码对象
>>> exec c # 执行
0
1
2
3
4
5
6
7
8
9
>>>
>>> str2 = '3*6 + 4*8'
>>> c2 = compile(str2,'','eval')# 编译为表达式
>>> result = eval_r(c2) # 执行
>>> result
50
>>>
python 2和3的区别:
exec
语句#就像
exec
语句也是这样的。exec()
函数使用一个包含任意Python代码的字符串作为参数,然后就像执行语句或者表达式一样执行它。exec()
跟eval()
是相似的,但是exec()
更加强大并更具有技巧性。eval()
函数只能执行单独一条表达式,但是能够执行多条语句,导入(import),函数声明 — 实际上整个Python程序的字符串表示也可以。
exec
()
Notes | Python 2 | Python 3 |
---|---|---|
① | exec codeString | exec(codeString) |
② | exec codeString in a_global_namespace | exec(codeString, a_global_namespace) |
③ | exec codeString in a_global_namespace,a_local_namespace | exec(codeString, a_global_namespace,a_local_namespace) |
- 在最简单的形式下,因为
exec()
现在是一个函数,而不是语句,2to3
会把这个字符串形式的代码用括号围起来。 - Python 2里的
exec
语句可以指定名字空间,代码将在这个由全局对象组成的私有空间里执行。Python 3也有这样的功能;你只需要把这个名字空间作为第二个参数传递给exec()
函数。 - 更加神奇的是,Python 2里的
exec
语句还可以指定一个本地名字空间(比如一个函数里声明的变量)。在Python 3里,exec()
函数也有这样的功能。
execfile
语句#
就像以前的exec
语句,Python 2里的execfile
语句也可以像执行Python代码那样使用字符串。不同的是exec
使用字符串,而execfile
则使用文件。在Python 3里,execfile
语句已经被去掉了。如果你真的想要执行一个文件里的Python代码(但是你不想导入它),你可以通过打开这个文件,读取它的内容,然后调用compile()
全局函数强制Python解释器编译代码,然后调用新的exec()
函数。