如何在Python中执行包含Python代码的字符串?
不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。
如何在Python中执行包含Python代码的字符串?
不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。
当前回答
Eval和exec是正确的解决方案,使用起来更安全。
正如Python参考手册中所讨论并在本教程中明确解释的那样,eval和exec函数接受两个额外的形参,允许用户指定可用的全局和局部函数和变量。
例如:
public_variable = 10
private_variable = 2
def public_function():
return "public information"
def private_function():
return "super sensitive information"
# make a list of safe functions
safe_list = ['public_variable', 'public_function']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
# add any needed builtins back in
safe_dict['len'] = len
>>> eval("public_variable+2", {"__builtins__" : None }, safe_dict)
12
>>> eval("private_variable+2", {"__builtins__" : None }, safe_dict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'private_variable' is not defined
>>> exec("print \"'%s' has %i characters\" % (public_function(), len(public_function()))", {"__builtins__" : None}, safe_dict)
'public information' has 18 characters
>>> exec("print \"'%s' has %i characters\" % (private_function(), len(private_function()))", {"__builtins__" : None}, safe_dict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'private_function' is not defined
实际上,您是在定义代码将在其中执行的名称空间。
其他回答
Eval和exec是正确的解决方案,使用起来更安全。
正如Python参考手册中所讨论并在本教程中明确解释的那样,eval和exec函数接受两个额外的形参,允许用户指定可用的全局和局部函数和变量。
例如:
public_variable = 10
private_variable = 2
def public_function():
return "public information"
def private_function():
return "super sensitive information"
# make a list of safe functions
safe_list = ['public_variable', 'public_function']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
# add any needed builtins back in
safe_dict['len'] = len
>>> eval("public_variable+2", {"__builtins__" : None }, safe_dict)
12
>>> eval("private_variable+2", {"__builtins__" : None }, safe_dict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'private_variable' is not defined
>>> exec("print \"'%s' has %i characters\" % (public_function(), len(public_function()))", {"__builtins__" : None}, safe_dict)
'public information' has 18 characters
>>> exec("print \"'%s' has %i characters\" % (private_function(), len(private_function()))", {"__builtins__" : None}, safe_dict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'private_function' is not defined
实际上,您是在定义代码将在其中执行的名称空间。
Eval()只是用于表达式,而Eval ('x+1')可以工作,Eval ('x=1')则不能工作。在这种情况下,最好使用exec,甚至更好:尝试找到一个更好的解决方案:)
好吧. .我知道这不是一个确切的答案,但可能是对那些和我一样看待这个问题的人的一个提示。我想为不同的用户/客户执行特定的代码,但也想避免exec/eval。我最初打算将每个用户的代码存储在数据库中并执行上述操作。
我最终在“customer_filters”文件夹中创建文件系统上的文件,并使用“imp”模块,如果没有为该客户应用过滤器,它就会继续进行
import imp
def get_customer_module(customerName='default', name='filter'):
lm = None
try:
module_name = customerName+"_"+name;
m = imp.find_module(module_name, ['customer_filters'])
lm = imp.load_module(module_name, m[0], m[1], m[2])
except:
''
#ignore, if no module is found,
return lm
m = get_customer_module(customerName, "filter")
if m is not None:
m.apply_address_filter(myobj)
so customerName = "jj" 将执行apply_address_filter从customer_filters\jj_filter.py文件
我尝试了很多方法,但唯一有效的方法是:
temp_dict = {}
exec("temp_dict['val'] = 10")
print(temp_dict['val'])
输出:
10
记住,从版本3开始,exec是一个函数! 所以总是使用exec(mystring)而不是exec mystring。