Да, так работает. Для Вас, похоже, нет невыполнимых задач!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def check_test():
print('a = 5')
a = 5
s = {'a': a}
exec('''
print(' Внутри "exec"')
print('a = 4')
a = 4
print('b = 3')
b = 3
print('a ->', a)
print('b ->', b)
''', {}, s)
print(' После "exec"')
print('s ->', s)
print('a ->', a)
b = s.get('b')
print('b ->', b)
check_test()
На выходе
a = 5
Внутри "exec"
a = 4
b = 3
a -> 4
b -> 3
После "exec"
s -> {'a': 4, 'b': 3}
a -> 5
b -> 3
Однако, строго говоря, мы не “легализовали” переменную из “exec”, а создали в локальной области другую с таким-же именем и значением. Почему меня интересует именно возможность или невозможность “легализации” переменных из “exec”? Причина в том, что в общем случае я могу не знать имён переменных, которые будут созданы текстом, переданным в “exec”. Интересует именно возможность или невозможность “легализации” всех переменных, которые будут созданы кодом в “exec”. Благодарю Вас за настойчивость.