如何在Python中执行包含Python代码的字符串?


不要对可能来自程序外部的任何形式的数据使用eval(或exec)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。如果你在这里是因为你想在你的Python程序中按照一个模式创建多个变量,你几乎肯定有一个XY问题。完全不要创建这些变量——相反,适当地使用列表或字典。


当前回答

就像其他人提到的,是“exec”。

但是,如果你的代码包含变量,你可以使用"global"来访问它,也可以防止编译器引发以下错误:

NameError: name 'p_variable'没有定义

exec('p_variable = [1,2,3,4]')
global p_variable
print(p_variable)

其他回答

Eval()只是用于表达式,而Eval ('x+1')可以工作,Eval ('x=1')则不能工作。在这种情况下,最好使用exec,甚至更好:尝试找到一个更好的解决方案:)

记住,从版本3开始,exec是一个函数! 所以总是使用exec(mystring)而不是exec mystring。

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

实际上,您是在定义代码将在其中执行的名称空间。

就像其他人提到的,是“exec”。

但是,如果你的代码包含变量,你可以使用"global"来访问它,也可以防止编译器引发以下错误:

NameError: name 'p_variable'没有定义

exec('p_variable = [1,2,3,4]')
global p_variable
print(p_variable)

值得一提的是,如果你想调用一个Python文件,exec的兄弟也存在,叫做execfile。如果你在第三方包中工作,其中包含了糟糕的IDE,而你想在他们的包外编码,这有时是件好事。

例子:

execfile(“path / to /源代码. py”)

or:

执行(open (" - path / to /源代码read . py”)。()