Getting namespaces right when parsing/executing Python ASTs

Discussion in 'Python' started by Gordon Fraser, Oct 7, 2008.

  1. 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
     
    Gordon Fraser, Oct 7, 2008
    #1
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Paul McGuire
    Replies:
    0
    Views:
    288
    Paul McGuire
    Dec 16, 2003
  2. Mike McGavin
    Replies:
    5
    Views:
    711
    Mike McGavin
    Jan 19, 2005
  3. Greg Wogan-Browne
    Replies:
    1
    Views:
    811
    Uche Ogbuji
    Jan 28, 2005
  4. lionheart

    "Right" use of namespaces

    lionheart, Aug 14, 2006, in forum: C++
    Replies:
    4
    Views:
    298
    Daniel T.
    Aug 14, 2006
  5. eliben
    Replies:
    0
    Views:
    325
    eliben
    Feb 14, 2009
Loading...

Share This Page