Вы можете использовать метод eval(string)
для этого.
Определение
eval(code, globals=None, locals=None)
Код является просто стандартным кодом Python - это означает, что он все еще должен быть правильно отступ.
Для глобалов может быть определен пользовательский __builtins__
, который может быть полезен в целях безопасности.
Пример
eval("print('Hello')")
Выведет hello
на консоль. Вы также можете указать локальные и глобальные переменные для используемого кода:
eval("print('Hello, %s'%name)", {}, {'name':'person-b'})
Проблемы безопасности
Будьте осторожны, хотя. Любой пользовательский ввод будет выполнен. Рассмотрим:
eval("import os;os.system('sudo rm -rf /')")
Есть несколько способов обойти это. Проще всего сделать что-то вроде:
eval("import os;...", {'os':None})
Что вызовет исключение, а не стирает ваш жесткий диск. В то время как ваша программа является настольной, это может быть проблемой, если люди распространяют сценарии, что, я думаю, предназначено.
Странный пример
Вот пример использования eval
довольно странно:
def hello() : print('Hello')
def world() : print('world')
CURRENT_MOOD = 'happy'
eval(get_code(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))
То, что это делает на линии eval:
- Дает текущему модулю другое имя (оно становится
contrivedExample
сценарию). Потребитель может звонить contrivedExample.hello()
сейчас.)
- Он определяет
hi
как указывающий на hello
- Он объединил этот словарь со списком текущих глобальных переменных в исполняющем модуле.
FAIL
Оказывается (спасибо, комментаторы!), Что вам действительно нужно использовать оператор exec
. Большой ой. Пересмотренные примеры:
exec
Определение
(это выглядит знакомо!)
Exec это утверждение:
exec "code" [in scope]
Где область действия - это словарь локальных и глобальных переменных. Если это не указано, оно выполняется в текущей области.
Код является просто стандартным кодом Python - это означает, что он все еще должен быть правильно отступ.
exec
Пример
exec "print('hello')"
Будет выводить hello
на консоль. Вы также можете указать локальные и глобальные переменные для используемого кода:
eval "print('hello, '+name)" in {'name':'person-b'}
exec
Проблемы безопасности
Будьте осторожны, хотя. Любой пользовательский ввод будет выполнен. Рассмотрим:
exec "import os;os.system('sudo rm -rf /')"
Распечатать заявление
Как отмечают комментаторы, print
- это утверждение во всех версиях Python до 3.0 В 2.6 поведение можно изменить, набрав from __future__ import print_statement
. В противном случае используйте:
print "hello"
Вместо:
print("hello")