|
Neil Gower
ngower at dkp.com
Fri Nov 11 12:15:44 EST 2005
Thanks Graham! It works like a charm. I had totally forgotten about the
Profile class... the downside to convenience methods I guess. :-)
I'll see how it goes re: meaningful timing data... I expect that for slow
enough pages the profiler will yield some useable stats, which is really what
I'm worried about. I think I've got some PSP pages doing some pretty heavy
processing, hopefully now I'll have the stats to prove it.
Cheers,
Neil
Graham Dumpleton wrote:
> Use this:
>
> # but this doesn't...
> #rc = profile.run( 'processPsp()', 'ProfilerTest.psp.prof' )
> #return rc
>
> pobject = profile.Profile()
> presult = pobject.runctx('processPsp()',globals(),locals())
> presult.dump_stats("/tmp/ProfilerTest.psp.prof")
>
> The default run() method uses globals from __main__ module and
> thus why it can't find symbol.
>
> Also need to specify absolute path for where stats are being saved
> as no gaurantee as to what current working directory is when run
> in the context of mod_python.
>
> To print out stats do the following, although a single call doesn't
> give you enough data for meaningful time values unless there is
> something I missed.
>
> /tmp [504]$ python
> Python 2.3 (#1, Sep 13 2003, 00:49:11)
> [GCC 3.3 20030304 (Apple Computer, Inc. build 1495)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.
>
>>>>import pstats
>>>>stats = pstats.Stats("/tmp/ProfilerTest.psp.prof")
>>>>stats.print_stats()
>
> Fri Nov 11 14:14:46 2005 /tmp/stats.dat
>
> 19 function calls in 0.000 CPU seconds
>
> Random listing order was used
>
> ncalls tottime percall cumtime percall filename:lineno(function)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:123(cache_get)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:60(__init__)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/posixpath.py:74(split)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:91(__init__)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/posixpath.py:47(isabs)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/posixpath.py:197(isfile)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/posixpath.py:144(getmtime)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:139(cache_store)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:403(store)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/posixpath.py:56(join)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/stat.py:29(S_IFMT)
> 1 0.000 0.000 0.000 0.000 /Users/grahamd/Sites/profiler/ProfilerTest.psp:1(?)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:186(run)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/stat.py:54(S_ISREG)
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:408(get)
> 1 0.000 0.000 0.000 0.000 /Users/grahamd/Sites/profiler/profiler-handler.py:11(processPsp)
> 0 0.000 0.000 profile:0(profiler)
> 1 0.000 0.000 0.000 0.000 profile:0(processPsp())
> 1 0.000 0.000 0.000 0.000 /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/psp.py:159(load_from_file)
> 1 0.000 0.000 0.000 0.000 <string>:1(?)
>
>
> <pstats.Stats instance at 0x41d78>
>
>
> Graham
>
>
> Neil Gower wrote ..
>
>>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.
>>=============================================================================
>>_______________________________________________
>>Mod_python mailing list
>>Mod_python at modpython.org
>>http://mailman.modpython.org/mailman/listinfo/mod_python
|