¿Cómo comstackr una cadena de código Python en un módulo cuyas funciones se pueden llamar?

En Python, tengo una cadena de código fuente de Python que contiene funciones como:

mySrc = ''' def foo(): print("foo") def bar(): print("bar") ''' 

Me gustaría comstackr esta cadena en algún tipo de objeto similar a un módulo para poder llamar a las funciones contenidas en el código.

Aquí hay un pseudocódigo para lo que me gustaría hacer:

 myMod = myCompile(mySrc) myMod.foo() 

¿Es esto posible en Python? He intentado esto, pero no funciona:

 myMod = compile(mySrc, '', 'exec') myMod.foo() 

Esto produce un mensaje de error como este:

 <code object  at 0x104154730, file "", line 1>Traceback (most recent call last): File "myfile.py", line XX, in run myMod.foo() AttributeError: 'code' object has no attribute 'foo' 

Tienes que comstackrlo y ejecutarlo a la vez:

 myMod = compile(mySrc, '', 'exec') exec(myMod) foo() 

Puede pasar los dados a exec para evitar que foo escape. types.ModuleType con un objeto de módulo creado utilizando types.ModuleType :

 from types import ModuleType … compiled = compile(mySrc, '', 'exec') module = ModuleType("testmodule") exec(compiled, module.__dict__) 

En Python 2, quieres el paquete del comstackdor mágico:

 >>> import compiler >>> mod = compiler.parseFile("doublelib.py") >>> mod Module('This is an example module.\n\nThis is the docstring.\n', Stmt([Function(None, 'double', ['x'], [], 0, 'Return twice the argument', Stmt([Return(Mul((Name('x'), Const(2))))]))])) >>> from compiler.ast import * >>> Module('This is an example module.\n\nThis is the docstring.\n', ... Stmt([Function(None, 'double', ['x'], [], 0, ... 'Return twice the argument', ... Stmt([Return(Mul((Name('x'), Const(2))))]))])) Module('This is an example module.\n\nThis is the docstring.\n', Stmt([Function(None, 'double', ['x'], [], 0, 'Return twice the argument', Stmt([Return(Mul((Name('x'), Const(2))))]))])) >>> mod.doc 'This is an example module.\n\nThis is the docstring.\n' >>> for node in mod.node.nodes: ... print node ... Function(None, 'double', ['x'], [], 0, 'Return twice the argument', Stmt([Return(Mul((Name('x'), Const(2))))])) >>> func = mod.node.nodes[0] >>> func.code Stmt([Return(Mul((Name('x'), Const(2))))]) 

Y en Python 3, está incorporado .