如何在Python中执行包含Python代码的字符串?
不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。
如何在Python中执行包含Python代码的字符串?
不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。
当前回答
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文件
最合乎逻辑的解决方案是使用内置的eval()函数。另一种解决方案是将该字符串写入临时python文件并执行。
使用eval。
Eval()只是用于表达式,而Eval ('x+1')可以工作,Eval ('x=1')则不能工作。在这种情况下,最好使用exec,甚至更好:尝试找到一个更好的解决方案:)
我尝试了很多方法,但唯一有效的方法是:
temp_dict = {}
exec("temp_dict['val'] = 10")
print(temp_dict['val'])
输出:
10