Graham Dumpleton
grahamd at dscpl.com.au
Thu Nov 10 22:58:10 EST 2005
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
|