如何在Python中执行包含Python代码的字符串?
不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。
如何在Python中执行包含Python代码的字符串?
不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。
当前回答
记住,从版本3开始,exec是一个函数! 所以总是使用exec(mystring)而不是exec mystring。
其他回答
最合乎逻辑的解决方案是使用内置的eval()函数。另一种解决方案是将该字符串写入临时python文件并执行。
你可以使用exec完成代码的执行,就像下面的IDLE会话一样:
>>> kw = {}
>>> exec( "ret = 4" ) in kw
>>> kw['ret']
4
就像其他人提到的,是“exec”。
但是,如果你的代码包含变量,你可以使用"global"来访问它,也可以防止编译器引发以下错误:
NameError: name 'p_variable'没有定义
exec('p_variable = [1,2,3,4]')
global p_variable
print(p_variable)
好吧. .我知道这不是一个确切的答案,但可能是对那些和我一样看待这个问题的人的一个提示。我想为不同的用户/客户执行特定的代码,但也想避免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文件
值得一提的是,如果你想调用一个Python文件,exec的兄弟也存在,叫做execfile。如果你在第三方包中工作,其中包含了糟糕的IDE,而你想在他们的包外编码,这有时是件好事。
例子:
execfile(“path / to /源代码. py”)
or:
执行(open (" - path / to /源代码read . py”)。()