Added command line options for profile.py - one for stats output file

and one for sort order when using stdout.  Uses optparse.
This commit is contained in:
Nicholas Bastin 2004-03-23 18:44:39 +00:00
parent 6fca7cc783
commit 824b1b2da8
3 changed files with 37 additions and 11 deletions

View File

@ -131,6 +131,15 @@ a script to profile another script. For example:
python /usr/local/lib/python1.5/profile.py myscript.py
\end{verbatim}
\file{profile.py} accepts two optional arguments on the command line:
\begin{verbatim}
profile.py [-o output_file] [-s sort_order]
\end{verbatim}
\samp{-s} only applies to stdout (i.e. \samp{-o} is not supplied.
Look in the \class{Stats} documentation for valid sort values.
When you wish to review the profile, you should use the methods in the
\module{pstats} module. Typically you would load the statistics data as
follows:

View File

@ -39,6 +39,7 @@ import sys
import os
import time
import marshal
from optparse import OptionParser
__all__ = ["run","help","Profile"]
@ -55,7 +56,7 @@ __all__ = ["run","help","Profile"]
# Note that an instance of Profile() is *not* needed to call them.
#**************************************************************************
def run(statement, filename=None):
def run(statement, filename=None, sort=-1):
"""Run statement under profiler optionally saving results in filename
This function takes a single argument that can be passed to the
@ -74,7 +75,7 @@ def run(statement, filename=None):
if filename is not None:
prof.dump_stats(filename)
else:
return prof.print_stats()
return prof.print_stats(sort)
def runctx(statement, globals, locals, filename=None):
"""Run statement under profiler, supplying your own globals and locals,
@ -384,9 +385,9 @@ class Profile:
self.t = get_time() - t
def print_stats(self):
def print_stats(self, sort=-1):
import pstats
pstats.Stats(self).strip_dirs().sort_stats(-1). \
pstats.Stats(self).strip_dirs().sort_stats(sort). \
print_stats()
def dump_stats(self, file):
@ -556,15 +557,28 @@ def Stats(*args):
# When invoked as main program, invoke the profiler on a script
if __name__ == '__main__':
usage = "profile.py [-o output_file_path] [-s sort] scriptfile [arg] ..."
if not sys.argv[1:]:
print "usage: profile.py scriptfile [arg] ..."
print "Usage: ", usage
sys.exit(2)
filename = sys.argv[1] # Get script filename
class ProfileParser(OptionParser):
def __init__(self, usage):
OptionParser.__init__(self)
self.usage = usage
del sys.argv[0] # Hide "profile.py" from argument list
parser = ProfileParser(usage)
parser.allow_interspersed_args = False
parser.add_option('-o', '--outfile', dest="outfile",
help="Save stats to <outfile>", default=None)
parser.add_option('-s', '--sort', dest="sort",
help="Sort order when printing to stdout, based on pstats.Stats class", default=-1)
# Insert script directory in front of module search path
sys.path.insert(0, os.path.dirname(filename))
run('execfile(%r)' % (filename,))
(options, args) = parser.parse_args()
sys.argv[:] = args
if (len(sys.argv) > 0):
sys.path.insert(0, os.path.dirname(sys.argv[0]))
run('execfile(%r)' % (sys.argv[0],), options.outfile, options.sort)
else:
print "Usage: ", usage

View File

@ -290,6 +290,9 @@ Extension modules
Library
-------
- Added two new command-line arguments for profile (output file and
default sort).
- Added global runctx function to profile module
- Add hlist missing entryconfigure and entrycget methods.