Вопрос-Ответ

How do I execute a string containing Python code in Python?

Как мне выполнить строку, содержащую код Python, в Python?

Как мне выполнить строку, содержащую код Python, в Python?


Примечание редактора: Никогда не используйте eval (или exec) данные, которые могут поступать извне программы в любой форме. Это критический риск для безопасности. Вы разрешаете автору данных запускать произвольный код на вашем компьютере. Если вы здесь, потому что хотите создать несколько переменных в своей программе на Python по шаблону, у вас почти наверняка есть проблема XY. Вообще не создавайте эти переменные - вместо этого используйте list или dict соответствующим образом.

Переведено автоматически
Ответ 1

Для инструкций используйте exec(string) (Python 3) или exec string (Python 2):

>>> my_code = 'print("Hello world")'
>>> exec(my_code)
Hello world

Когда вам нужно значение выражения, используйте eval(string):

>>> x = eval("2+2")
>>> x
4

Однако первым шагом должно быть спросить себя, действительно ли вам это нужно. Выполнение кода обычно должно быть крайней мерой: это медленно, некрасиво и опасно, если он может содержать введенный пользователем код. Вы всегда должны сначала посмотреть на альтернативные варианты, такие как функции более высокого порядка, чтобы увидеть, могут ли они лучше соответствовать вашим потребностям.

Ответ 2

В примере строка выполняется как код с использованием функции exec.

import sys
import StringIO

# create file-like string to capture output
codeOut = StringIO.StringIO()
codeErr = StringIO.StringIO()

code = """
def f(x):
x = x + 1
return x

print 'This is my output.'
"""


# capture output and errors
sys.stdout = codeOut
sys.stderr = codeErr

exec code

# restore stdout and stderr
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

print f(4)

s = codeErr.getvalue()

print "error:\n%s\n" % s

s = codeOut.getvalue()

print "output:\n%s" % s

codeOut.close()
codeErr.close()
Ответ 3

eval and exec are the correct solution, and they can be used in a safer manner.

As discussed in Python's reference manual and clearly explained in this tutorial, the eval and exec functions take two extra parameters that allow a user to specify what global and local functions and variables are available.

For example:

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

In essence you are defining the namespace in which the code will be executed.

Ответ 4

Remember that from version 3 exec is a function!

so always use exec(mystring) instead of exec mystring.

python string