如何在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”)。()