[Python-Dev] Can I introspect/reflect to get arguments exec()? (original) (raw)

PJ Eby pje at telecommunity.com
Thu Mar 28 06:45:18 CET 2013


On Tue, Mar 26, 2013 at 11:00 PM, Rocky Bernstein <rocky at gnu.org> wrote:

Okay. But is the string is still somewhere in the CPython VM stack? (The result of LOADCONST 4 above). Is there a way to pick it up from there?

Maybe using C you could peek into the frame's value stack, but that's not exposed to any Python API I know of. But that still doesn't help you, because the value will be removed from the stack before exec() is actually called, which means if you go looking for it in code called from the exec (e.g. the call event itself), you aren't going to see the data.

At the point that we are stopped the exec action hasn't taken place yet.

That doesn't help if you're using line-level tracing events. At the beginning of the line, the data's not on the call stack yet, and by the time you enter the frame of the code being exec'd, it'll be off the stack again.

Basically, there is no way to do what you're asking for, short of replacing the built-in exec function with your own version. And it still won't help you with stepping through the source of functions that are compiled using an exec() or compile(), or any other way of ending up with dynamically-generated code you want to debug.

(Unless you use something like DecoratorTools to generate it, that is -- DecoratorTools has some facilities for caching dynamically-generated code so that it works properly with debuggers. But that has to be done by the code doing the generation, not the debugger. If the code generator uses DecoratorTools' caching support, then any debugger that uses the linecache module will Just Work. It might be nice for the stdlib should have something like this, but you could also potentially fake it by replacing the builtin eval, exec, compile, etc. functions w/versions that cache the source.)



More information about the Python-Dev mailing list