|
Neil Gower
ngower at dkp.com
Tue Nov 8 16:47:59 EST 2005
Hello,
I'm having some trouble trying to run my PSP pages through the standard
Python profiler. The problem appears to be that the python globals don't
behave as the profiler expects when it is run through mod_python.
The test handler (below) works okay with the profiler when invoked from a
regular command line Python interpreter, but it raises a "NameError: name
'processPsp' is not defined" exception when run through mod_python. I'm
taking that to mean that the profiler can't find the processPsp() method to
invoke.
Can anyone offer any suggestions? I'm stumped at this point.
Thanks!
Neil.
Details of my setup:
=============================================================================
Mod_python error: "PythonHandler profiler-handler"
Traceback (most recent call last):
File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 299, in
HandlerDispatch
result = object(req)
File "/var/profiler-test/profiler-handler.py", line 36, in handler
rc = profile.run( 'processPsp()', 'ProfilerTest.psp.prof' )
File "/usr/lib/python2.3/profile.py", line 71, in run
prof = prof.run(statement)
File "/usr/lib/python2.3/profile.py", line 403, in run
return self.runctx(cmd, dict, dict)
File "/usr/lib/python2.3/profile.py", line 409, in runctx
exec cmd in globals, locals
File "", line 1, in ?
NameError: name 'processPsp' is not defined
=============================================================================
Apache:
<Directory "/var/profiler-test">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
AddHandler mod_python .psp
PythonHandler profiler-handler
PythonDebug On
</Directory>
=============================================================================
/var/profiler-test/ProfilerTest.psp:
<p>This is a test!
<%
req.write( "<p>So is this!" )
%>
=============================================================================
/var/profiler-test/profiler-handler.py:
# we have to wrap these imports in a try block to be able to run the
# code outside of mod_python, where they will fail.
try:
from mod_python import apache, psp
except:
pass
import profile
def processPsp():
"""
A plain old method that uses global variables for the PSP
parameters, which makes it easy to use with the profiler.
"""
theRequest.content_type = "text/html"
template = psp.PSP( theRequest, theTemplateFile )
template.run()
return apache.OK
# end processPsp()
def handler( req ):
"""
The mod_python hook for handling a page request.
"""
global theRequest
global theTemplateFile
theRequest = req
theTemplateFile = 'ProfilerTest.psp'
# This works...
#rc = processPsp()
# but this doesn't...
rc = profile.run( 'processPsp()', 'ProfilerTest.psp.prof' )
return rc
# end handler()
if __name__ == '__main__':
try:
handler( None )
except AttributeError, e:
# if we actually make it into processPsp(), the null request
# object will cause an AttributeError.
print "A not unexpected error: %s" % str(e)
# end main.
=============================================================================
|