]> granicus.if.org Git - python/commitdiff
Added command line options for profile.py - one for stats output file
authorNicholas Bastin <nick.bastin@gmail.com>
Tue, 23 Mar 2004 18:44:39 +0000 (18:44 +0000)
committerNicholas Bastin <nick.bastin@gmail.com>
Tue, 23 Mar 2004 18:44:39 +0000 (18:44 +0000)
and one for sort order when using stdout.  Uses optparse.

Doc/lib/libprofile.tex
Lib/profile.py
Misc/NEWS

index 608e1cde4e8bdbb6cee6dbcdd74ffbe921237277..fa0f6b31a704c2598111382ee90a2f9e3d555925 100644 (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:
index 1a4ff67370be3ed475b11c24258ecb540999d9cf..2db70b7ea0862cadeacf2272a7e35809ba5ca87a 100755 (executable)
@@ -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
-
-    del sys.argv[0]         # Hide "profile.py" from argument list
-
-    # Insert script directory in front of module search path
-    sys.path.insert(0, os.path.dirname(filename))
-
-    run('execfile(%r)' % (filename,))
+    class ProfileParser(OptionParser):
+        def __init__(self, usage):
+            OptionParser.__init__(self)
+            self.usage = usage
+
+    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)
+
+    (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
index 50c5249bf5c9eadb270f70b1c9b922b59ec31571..be6984b4fd96d912c75236f8d7eafd543e8f86b7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.