Getting namespaces right when parsing/executing Python ASTs

G

Gordon Fraser

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,239
Members
46,827
Latest member
DMUK_Beginner

Latest Threads

Top