EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Как в питон-коде исполняемого в exec() изменить внешние объекты?

Есть такой код:
def executeRule(stdout, rule):
	obj = None
	try:
		parsedJson = json.loads(stdout)
		pyCmd = 'obj = parsedJson' + rule
		exec( pyCmd  )
	except BaseException as e:
		print( e, file=sys.stderr)
	return obj



Здесь:

rule — это строка получаемая из аргументов ком. строки sys.argv[2]

stdout — это вывод полученный в результате запуска консольной тулзы


Мне надо после распарсивания stdout сконвертировать в привычные структуры данных на питоне и получить из них значение. Вся соль в том что мне надо получить на основании переданного в ком. строке.


Проблема заключается в том что после exec() obj не меняется и продолжает быть установленным в None. Хотя если пишешь код без exec, а на пряму, то значение вытаскивается и оно в распарсенном json есть!


Как организовать сабж? В чем проблема?


ЗЫ:

На питоне токо токо начинаю работать
  • Вопрос задан
  • 3689 просмотров
Решения вопроса 1
@ILJICH
В exec и eval можно прямо задавать глобальные и локальные переменные: eval(expression[, globals[, locals]])
>>> obj = None
>>> exec("obj = 2", {}, locals())
>>> print obj
2
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Правильно, потому, что exec выполняется в другом пространстве имен. Попробуйте так:

obj = None
exec("""import random; global obj; obj = random.random(); obj *= 100;""")
print(obj)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы