[Python-Dev] Can I introspect/reflect to get arguments exec()?
Rocky Bernstein
rocky at gnu.org
Wed Mar 27 04:00:55 CET 2013
More information about the Python-Dev mailing list
Wed Mar 27 04:00:55 CET 2013
- Previous message: [Python-Dev] Can I introspect/reflect to get arguments exec()?
- Next message: [Python-Dev] Can I introspect/reflect to get arguments exec()?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Tue, Mar 26, 2013 at 10:18 PM, Benjamin Peterson <benjamin at python.org>wrote: > 2013/3/26 Rocky Bernstein <rocky at gnu.org>: > > [asked on comp.lang.python but no takers. So I'm bumping it up a notch.] > > > > I have ported my Python debugger pydbgr to Python3. See [1] or [2]. > > > > Inside the debugger, when there is an exec() somewhere in the call stack, > > I'd like to be able to retrieve the string parameter. With this, the > > debugger can show part of the string in a call stack. Or it can show the > > text when the frame is set to that exec() frame. > > > > Going further, the debugger could write the exec string out to a > temporary > > file. And when reporting locations, it could report not just something > like > > "<string> line 4", but also give that temporary file name which a > front-end > > could use as well. > > > > So consider this code using inspect.getargvalues() and > > inspect.currentframe(): > > > > import inspect > > def my_exec(string): > > show_args(inspect.currentframe()) # simulate exec(string) > > > > def show_args(frame): > > print(inspect.getargvalues(frame)) > > > > my_exec("show_args(inspect.currentframe())") > > exec("show_args(inspect.currentframe())") > > > > > > When run this is the output: > > > > python3 exec-args.py > > ArgInfo(args=['string'], varargs=None, keywords=None, > locals={'string': > > 'show_args(inspect.currentframe())'}) > > ArgInfo(args=[], varargs=None, keywords=None, locals={'my_exec': > > <function my_exec at 0xb6f828ec>,, ... > > > > > > In a different setting, CPython byte-code assembly that gets generated > for > > running exec() is: > > > > 25 88 LOAD_GLOBAL 10 (exec) > > 91 LOAD_CONST 4 > > ('show_args(inspect.currentframe())') > > --> 94 CALL_FUNCTION 1 > > 97 POP_TOP > > > > What's going on? > > execing something is not the same as calling it, so there are no arguments. > Okay. But is the string is still somewhere in the CPython VM stack? (The result of LOAD_CONST 4 above). Is there a way to pick it up from there? At the point that we are stopped the exec action hasn't taken place yet. > > > -- > Regards, > Benjamin > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20130326/a92cbe26/attachment-0001.html>
- Previous message: [Python-Dev] Can I introspect/reflect to get arguments exec()?
- Next message: [Python-Dev] Can I introspect/reflect to get arguments exec()?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-Dev mailing list