[pypy-dev] Python Execution Contexts
anatoly techtonik
techtonik at gmail.com
Wed Mar 20 17:05:50 CET 2013
On Wed, Mar 20, 2013 at 5:28 PM, Amaury Forgeot d'Arc <amauryfa at gmail.com>wrote:
> 2013/3/20 anatoly techtonik <techtonik at gmail.com>
>
>> Hi,
>>
>> I've created a module to dump function trace during execution of Python
>> script. You can see session example in attachment. The format is of PHP
>> Xdebug tool [2] just because I had some scripts from the past to analyze it.
>>
>> The module uses sys.settrace() to analyse frames in 'call' events with
>> callback(frame, event, arg).
>>
>> Recently I've got an anonymous report that some frame misses filename
>> information when run under IDE:
>>
>> https://bitbucket.org/techtonik/xtrace/issue/2/use-of-xtrace-module-within-ide-causes
>>
>> There is unlikely to be any more feedback from the user to make me
>> understand and reproduce the behavior, nor there is a sufficient
>> documentation in sys.trace description [1]. So I am on my own. But I can
>> not read C code the CPython is written in, so I ask here.
>>
>> What are possible execution contexts for Python?
>> How each execution context affects data structure that is passed to trace
>> function (frame and arg)?
>>
>
> It's simpler than that: when running from an interactive session, f_back
> is empty...
>
> >>> def trace(frame, event, arg):
> ... funcname = frame.f_code.co_name
> ... if funcname == '<module>':
> ... print frame.f_back.f_code.co_filename
> ...
> >>> import sys
> >>> sys.settrace(trace)
> >>> 1
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 4, in trace
> AttributeError: 'NoneType' object has no attribute 'f_code'
>
Thanks a lot. =)
User said he was using module from the IDE and at first I thought it wasn't
possible to use module without previous stack frame (f_back), but I was
wrong:
> py -2 -s -S
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
on win32
>>> import xtrace
>>> xtrace.start()
TRACE START [2013-03-20 18:49:27]
>>> z = 0
-> decode() C:\Python27\lib\encodings\cp437.py:14
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "xtrace.py", line 66, in function_trace_xdebug
filename = self._strip_cwd(frame.f_back.f_code.co_filename)
AttributeError: 'NoneType' object has no attribute 'f_code'
On the way I've discovered that my Python is hacked. Without -s -S key it
executes modules from local temp directory.
...
-> ensure_unicode()
c:\users\user\appdata\local\temp\easy_install-k8gvbp\pyreadline-1.7.1-py2.7-win32.egg.tmp\pyre
dline\unicode_helper.py:20
...
So there are absolutely no differences in running code in these execution
contexts?
- code runs from a file
- code runs from a interactive console
I realize that I don't know how to set trace function for external file, so
that when the file is executed, the first frame won't have the previous
stack frame. I do it like so:
start()
execfile(script)
stop()
--
anatoly t.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pypy-dev/attachments/20130320/13e9e1d1/attachment-0001.html>
More information about the pypy-dev
mailing list