15

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'
4

2 に答える 2

22

コンパイルと実行の両方を行う必要があります。

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

口述を渡して「漏れ」execを止めることができます。fooを使用して作成されたモジュール オブジェクトと組み合わせますtypes.ModuleType

from types import ModuleType
…
compiled = compile(mySrc, '', 'exec')
module = ModuleType("testmodule")
exec(compiled, module.__dict__)
于 2013-11-08T01:49:03.227 に答える
1

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 では、それは に組み込まれています。

于 2013-11-08T01:53:51.517 に答える