Hi,
I'm trying to parse Python code to an AST, apply some changes to the AST
and then compile and run the AST, but I'm running into problems when
trying to evaluate/execute the resulting code object. It seems that the
global namespace differs depending on where I call parse and eval/exec.
The following code parses a file, compiles and then evaluates the AST.
If I call Python directly on this code, then it works:
import sys, parser
ast = parser.suite(open(sys.argv[1]).read())
code = ast.compile()
exec(code)
...and it also works this way with Python2.6:
ast = compile(open(sys.argv[1]).read(), "<AST>",
'exec',_ast.PyCF_ONLY_AST)
code = compile(ast, "<AST", "exec")
exec(code)
However, if I include that snippet in a different scope (some function
or class), then the namespace that the code object will have differs -
it seems the symbols defined in the AST are not included when executing
the code. For example:
import sys,parser
def main():
ast = parser.suite(open(sys.argv[1]).read())
code = ast.compile()
exec(code)
if __name__ == "__main__":
main()
In particular this is a problem if I'm parsing a module with several
functions - none of these functions actually ends up in the scope of the
code object (same behavior with Python2.6 and the PyCF_ONLY_AST
version).
The function "exec" takes parameters for globals and locals, but I have
no idea where to get these dictionaries from the "parser" module. My
guess is that I am misunderstanding something about how Python treats
namespaces. Can anyone help me here?
Thanks,
Gordon
--
http://mail.python.org/mailman/listinfo/python-list