Have you tried passing in empty dicts for globals and locals? I think
that the defaults will be the *current* globals and locals, and then
of course your namespace is broken...
On Tue, Oct 7, 2008 at 1:26 PM, Gordon Fraser <gfraser79@gmai l.comwrote:
--
orestis@orestis .gr
that the defaults will be the *current* globals and locals, and then
of course your namespace is broken...
On Tue, Oct 7, 2008 at 1:26 PM, Gordon Fraser <gfraser79@gmai l.comwrote:
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(op en(sys.argv[1]).read())
code = ast.compile()
exec(code)
>
...and it also works this way with Python2.6:
>
ast = compile(open(sy s.argv[1]).read(), "<AST>",
'exec',_ast.PyC F_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(op en(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 misunderstandin g something about how Python treats
namespaces. Can anyone help me here?
>
Thanks,
Gordon
>
>
--
>
>
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(op en(sys.argv[1]).read())
code = ast.compile()
exec(code)
>
...and it also works this way with Python2.6:
>
ast = compile(open(sy s.argv[1]).read(), "<AST>",
'exec',_ast.PyC F_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(op en(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 misunderstandin g something about how Python treats
namespaces. Can anyone help me here?
>
Thanks,
Gordon
>
>
--
>
--
orestis@orestis .gr