赞
踩
纸上得来终觉浅,绝知此事要躬行。------ 宋·陆游《冬夜读书示子聿》
在实际应用中,我们不清楚实际需要执行那一段程序,为了保证灵活性,我们需要动态的生成代码然后执行,所以今天简单的总结一下使用python执行python代码。
想要动态执行Python脚本,需要知道如何将字符串或者文件内容转化为python和识别的指令。实现代码动态加载并执行,可以使用eval() 和exec()函数。
eval() 函数用来执行一个字符串表达式,并返回表达式的值。语法如下:
eval(expression, globals=None, locals=None)
注:它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。
exec() 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。
exec(object[, globals[, locals]])
exec 返回值永远为 None。
动态执行python的方式有多种,简单列举一下有下面几种:
现在我们就逐一说明使用方法吧。
如果执行一行字符串表达式是,可以使用eval()和exec()函数,但是exec()方法不能返回结果。这里只举例演示eval()方法的使用:
def print_str():
eval("print('hello world')")
def add(x, y):
return eval("x+y")
if __name__ == "__main__":
print_str()
print(add(12, 56))
执行结果如下:
如果是执行多行字符串表达式,eval()不太好多用,eval不支持任意形式的赋值操作。所以要使用exec()方法。
expr = """
count = 10
for index in range(count):
print(index)
"""
def eval_code():
eval(expr)
def exec_for():
exec(expr)
if __name__ == "__main__":
exec_for()
# eval_for() # 这样写会报错
演示如下:
执行函数其实和其他的没有什么区别,eval()和exec()函数都可以使用
def print_str():
eval("print('hello world')")
def eval_fun():
eval("print_str()")
def exec_fun():
exec("print_str()")
if __name__ == "__main__":
eval_fun()
exec_fun()
运行结果如下:
有时我们需要执行一个py文件的话,使用exec()函数可以使用,其实在Python2中有一个execfile()内置函数可以实现执行python文件,但是在python3中已经将该方法删除掉了。所以只能使用exec()执行python文件。
def exec_file(file_name, func_name):
with open(file_name, "rb") as f:
source_code = f.read()
exec_code = compile(source_code, file_name, "exec")
scope = {}
exec(exec_code, scope)
f = scope.get(func_name, None)
f()
if __name__ == "__main__":
exec_file(文件名, 方法名)
# -*- coding: utf-8 -*- # 动态执行python expr = """ count = 10 for index in range(count): print(index) """ def print_str(): eval("print('hello world')") def add(x, y): return eval("x+y") def eval_for(): eval(expr) def exec_code(): exec("print('hello world')") def exec_for(): exec(expr) def eval_fun(): eval("print_str()") def exec_fun(): exec("print_str()") def exec_file(file_name, func_name): with open(file_name, "rb") as f: source_code = f.read() exec_code = compile(source_code, file_name, "exec") scope = {} exec(exec_code, scope) f = scope.get(func_name, None) f() if __name__ == "__main__": # print_str() # print(add(12, 56)) # exec_fun() # sum = add(12, 45) # print("sum=", sum) # exec_for() # eval_for() eval_fun() exec_fun() # 我测试的使用使用的我的博客的文件名,大家可以去我的博客里面取 # https://blog.csdn.net/m1090760001/article/details/103329077 # exec_file("seleniumblog.py", "open_blog")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。