1 #!/usr/bin/env python 2 # -*- coding: iso-8859-1 -*- 3 4 """ 5 Run a Python script under hotshot's control. 6 7 Adapted from a posting on python-dev by Walter Drwald 8 9 usage %prog [ %prog args ] filename [ filename args ] 10 11 Any arguments after the filename are used as sys.argv for the filename. 12 """ 13 14 import sys 15 import optparse 16 import os 17 import hotshot 18 import hotshot.stats 19 20 PROFILE = "hotshot.prof" 21 22 def run_hotshot(filename, profile, args): 23 prof = hotshot.Profile(profile) 24 sys.path.insert(0, os.path.dirname(filename)) 25 sys.argv = [filename] + args 26 prof.run("execfile(%r)" % filename) 27 prof.close() 28 stats = hotshot.stats.load(profile) 29 stats.sort_stats("time", "calls") 30 31 # print_stats uses unadorned print statements, so the only way 32 # to force output to stderr is to reassign sys.stdout temporarily 33 save_stdout = sys.stdout 34 sys.stdout = sys.stderr 35 stats.print_stats() 36 sys.stdout = save_stdout 37 38 return 0 39 40 def main(args): 41 parser = optparse.OptionParser(__doc__) 42 parser.disable_interspersed_args() 43 parser.add_option("-p", "--profile", action="store", default=PROFILE, 44 dest="profile", help='Specify profile file to use') 45 (options, args) = parser.parse_args(args) 46 47 if len(args) == 0: 48 parser.print_help("missing script to execute") 49 return 1 50 51 filename = args[0] 52 return run_hotshot(filename, options.profile, args[1:]) 53 54 if __name__ == "__main__": 55 sys.exit(main(sys.argv[1:])) 56