Как скомпилировать строку кода Python в модуль, функции которого можно вызвать?

В Python у меня есть строка исходного кода Python, содержащая такие функции, как:

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

Я хотел бы скомпилировать эту строку в какой-то модульный объект, поэтому я могу вызвать функции, содержащиеся в коде.

Вот псевдокод для того, что я хотел бы сделать:

 myMod = myCompile(mySrc) myMod.foo() 

Возможно ли это на Python? Я пробовал это, но он не работает:

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

Появится сообщение об ошибке следующего вида:

 <code object <module> 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' 

Вам нужно как скомпилировать, так и выполнить его:

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

Вы можете передать dicts в exec чтобы остановить foo от «утечки». Объедините его с объектом модуля, созданным с использованием types.ModuleType :

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

В Python 2 вам нужен магический пакет компилятора :

 >>> 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))))]) 

И в Python 3 он встроен .