2013-06-06 2 views
2

Мне нужно динамически генерировать код python и выполнять его с помощью функции eval().Оценка динамически сгенерированных операторов в Python

Что бы я хотел сделать, это сгенерировать некоторые «импорт» и «присваивать значения». Я имею в виду, мне нужно сгенерировать эту строку, чтобы оценить ее. eval(x).

x = """ 
import testContextSummary 
import util.testGroupUtils 
testDb = [testContextSummary.TestContextSummary, 
      testGroupUtils.testGroupUtils.TestGroupUtils] 
""" # x is automatically generated 
eval(x) 
... use testDb ... 

Я пытался с этим кодом, но Eval() возвращает ошибку, не признающий import, поэтому я попробовал этот код.

x = """ 
testContextSummary = __import__("testContextSummary") 
testGroupUtils = __import__("util.testGroupUtils") 
testDb = [testContextSummary.TestContextSummary, 
      testGroupUtils.testGroupUtils.TestGroupUtils] 
""" # x is automatically generated 

eval(x) # error 

У меня снова появилась ошибка, не позволяющая присваивать присваивание.

Есть ли способ выполнить динамически сгенерированный скрипт python и использовать результат из оценки?

ответ

2

Вы хотите, чтобы exec вместо eval.

>>> s = "x = 2" 
>>> exec s 
>>> x 
2 

Конечно, пожалуйста, не используйте exec на ненадежных строк ...

+0

prosseek: Это потому, что 'Exec()' может обрабатывать несколько строк Python, тогда как 'eval()' оценивает только одно выражение. Быть безопасным. – martineau

+0

@martineau: Я не видел исходного комментария, но те же предостережения с 'exec' одинаково применимы к' eval', и это не имеет ничего общего с несколькими строками кода ... ('__import __ ('os'). remove ('important_file') ') – mgilson

0

Это может также работать:

x = """[ 
     __import__("testContextSummary").TestContextSummary, 
     __import__("util.testGroupUtils").testGroupUtils.TestGroupUtils] 
""" 
testDB=eval(x) 
+0

Хотя это может сработать в этом конкретном случае, все может стать сложным, если было определено несколько имен или была сложная логика в динамически сгенерированном коде, например,' if/else' конструкции и/или определения функций/классов и т. д. - все из которых 'exec()' должно обрабатываться. – martineau

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