2010-09-26 2 views

ответ

3
code = "for a in range(10):\n\tprint 'lol'\n" 
eval(compile(code, 'downloaded_code_fake_filename', 'exec')) 

, но Остерегайтесь проблем безопасности! Исходный код должен быть криптографически подписан и не передаваться открытым текстом.

+0

code = "for a in range (10): \ n \ tprint 'lol' \ n" eval (компиляция (код, 'download_code_fake_filename', 'exec')) не понял. не могли бы вы немного объяснить? –

+0

@Ani: В своем ответе @BatchyX привел пример того, как выполнить код, который вы получите от клиента. 'code' - пример фрагмента кода; скопируйте его в IDLE и «распечатайте» его, чтобы посмотреть, как он выглядит. 'eval' - встроенная функция, которая оценивает фрагмент кода, назначенный переменной' code'. См. Документы: http://docs.python.org/library/functions.html#eval –

+2

- функция exec устарела? Неужели он просто «exec (code)»? – Manux

0

см. http://docs.python.org/py3k/library/functions.html#exec для exec() функция. он не устарел в py3.1. Я рекомендую делать просто exec(code). значения могут быть переданы путем проверки переменных в любых глобал или местных жителями словаря:

code = """ 
def f(): return 42 
R = f() 
""" 
d = {} 
exec(code, d) 
print(d[ 'R' ]) 
1

Я бы рекомендовал использовать execnet. Он хорошо поддерживается и из того, что я читал, намного безопаснее, чем сырой exec или eval. За то, что вы пытаетесь сделать, проверьте basic examples.

+0

блестящий! и интересный и полезный способ обработки распределенных/агентов в python. – user106514

0

Ответ Dcolish - это хорошо. Я не уверен, что идея выполнения кода, входящего в сетевой интерфейс, сама по себе хороша сама по себе - вам нужно будет убедиться, что вы можете доверять отправляющей стороне, особенно если этот интерфейс будет подвергнут воздействию Интернет или действительно любую производственную сеть.

Смежные вопросы