inspect.stack() or inspect.currentframe() gives "list index out ofrange error"

D

deluxstar

Hi,

We have an application working on several servers generally written
with Python 2.6 and Twisted 10.
The source codes are located in one server and compiled in this
server. The compiled files are copied to other server via network and
application server works with these compiled files.

In this application, I have to write a function to return a value of
the caller object that calles this function. The function may be
called from several modules of the application. To achieve this goal,
I try to use the python inspect module:

curframe = inspect.currentframe()
calframe = inspect.getouterframes(curframe, 2)
calframe[1][0].f_locals['variable']

This sample code works on local development environment both on linux
and windows. When checked in to production environment,
inspect.currentframe() or inspect.stack() function gives "List index
out of range error".

When I googled, I found only one clue of copying pyc files:
http://forum.webfaction.com/viewtopic.php?pid=16808

Why inspect modules gives this error? OR Is there another way to get
the caller objects variable value?

Thanks in advance.
 
P

Peter Otten

deluxstar said:
We have an application working on several servers generally written
with Python 2.6 and Twisted 10.
The source codes are located in one server and compiled in this
server. The compiled files are copied to other server via network and
application server works with these compiled files.

In this application, I have to write a function to return a value of
the caller object that calles this function. The function may be
called from several modules of the application. To achieve this goal,
I try to use the python inspect module:

curframe = inspect.currentframe()
calframe = inspect.getouterframes(curframe, 2)
calframe[1][0].f_locals['variable']

This sample code works on local development environment both on linux
and windows. When checked in to production environment,
inspect.currentframe() or inspect.stack() function gives "List index
out of range error".

When I googled, I found only one clue of copying pyc files:
http://forum.webfaction.com/viewtopic.php?pid=16808

Why inspect modules gives this error? OR Is there another way to get
the caller objects variable value?

Can you provide the actual traceback? Provide a small script that reproduces
the error? Add print statements and post their output?

print inspect.currentframe
curframe = inspect.currentframe() print curframe
calframe = inspect.getouterframes(curframe, 2)
print calframe

Peter
 
D

deluxstar

deluxstar said:
We have an application working on several servers generally written
with Python 2.6 and Twisted 10.
The source codes are located in one server and compiled in this
server. The compiled files are copied to other server via network and
application server works with these compiled files.
In this application, I have to write a function to return a value of
the caller object that calles this function. The function may be
called from several modules of the application. To achieve this goal,
I try to use the python inspect module:
curframe = inspect.currentframe()
calframe = inspect.getouterframes(curframe, 2)
calframe[1][0].f_locals['variable']
This sample code works on local development environment both on linux
and windows. When checked in to production environment,
inspect.currentframe() or inspect.stack() function gives "List index
out of range error".
When I googled, I found only one clue of copying pyc files:
http://forum.webfaction.com/viewtopic.php?pid=16808
Why inspect modules gives this error? OR Is there another way to get
the caller objects variable value?

Can you provide the actual traceback? Provide a small script that reproduces
the error? Add print statements and post their output?

print inspect.currentframe> curframe = inspect.currentframe()
print curframe
calframe = inspect.getouterframes(curframe, 2)

print calframe

Peter

The traceback is:
2010-09-25 10:50:38+0300 [-] Traceback (most recent call last):
2010-09-25 10:50:38+0300 [-] File "../appsrv/lqcommon.py", line 983,
in getPRMS
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 931, in getouterframes
2010-09-25 10:50:38+0300 [-] framelist.append((frame,) +
getframeinfo(frame, context))
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 906, in getframeinfo
2010-09-25 10:50:38+0300 [-] lines, lnum = findsource(frame)
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 568, in findsource
2010-09-25 10:50:38+0300 [-] if pat.match(lines[lnum]): break
2010-09-25 10:50:38+0300 [-] IndexError: list index out of range

It is hard to reproduce the error with a script. I will work and send
if I success.
If the traceback tells smth, please tell me :)
Thnx
 
S

Steven D'Aprano

The traceback is:
2010-09-25 10:50:38+0300 [-] Traceback (most recent call last):
2010-09-25 10:50:38+0300 [-] File "../appsrv/lqcommon.py", line 983,
in getPRMS
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 931, in getouterframes
2010-09-25 10:50:38+0300 [-] framelist.append((frame,) +
getframeinfo(frame, context))
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 906, in getframeinfo
2010-09-25 10:50:38+0300 [-] lines, lnum = findsource(frame)
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 568, in findsource
2010-09-25 10:50:38+0300 [-] if pat.match(lines[lnum]): break
2010-09-25 10:50:38+0300 [-] IndexError: list index out of range

I'm going to take a wild guess here.

My guess is that you've copied the .pyc file onto the server, BUT there
is also an *older* version of the .py file there as well. Because the
modification date is older than that of the .pyc file, Python executes
the compiled code from the .pyc file. But when you search for the source
code, the old .py file is discovered -- but it doesn't have the right
number of lines, and so you end up with an IndexError.
 
W

Wolfgang Rohdewald

My guess is that you've copied the .pyc file onto the server,
BUT there is also an older version of the .py file there as
well. Because the modification date is older than that of the
.pyc file, Python executes the compiled code from the .pyc
file.

that would be horrible - this is what our own legacy software
does. A maintenance nightmare. Think adjusting system time
or "cp -a spam.py"

Actually the docs say something different:

The modification time of the version of spam.py used to create
spam.pyc is recorded in spam.pyc, and the .pyc file is ignored if
these don’t match.

found here:
http://docs.python.org/tutorial/modules.html
 
T

Terry Reedy

The traceback is:
2010-09-25 10:50:38+0300 [-] Traceback (most recent call last):
2010-09-25 10:50:38+0300 [-] File "../appsrv/lqcommon.py", line 983,
in getPRMS
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 931, in getouterframes
2010-09-25 10:50:38+0300 [-] framelist.append((frame,) +
getframeinfo(frame, context))
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 906, in getframeinfo
2010-09-25 10:50:38+0300 [-] lines, lnum = findsource(frame)
2010-09-25 10:50:38+0300 [-] File "/usr/lib/python2.6/inspect.py",
line 568, in findsource
2010-09-25 10:50:38+0300 [-] if pat.match(lines[lnum]): break
2010-09-25 10:50:38+0300 [-] IndexError: list index out of range

It is hard to reproduce the error with a script. I will work and send
if I success.
If the traceback tells smth, please tell me :)

The traceback is terribly difficult to read with the timestamps added.
They are not from Python. In the future, please try to suppress them or
use a global search/replace (with nothing) before posting such.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top