diff options
Diffstat (limited to 'Lib/trace.py')
| -rw-r--r-- | Lib/trace.py | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/Lib/trace.py b/Lib/trace.py index 3f00605..3611f88 100644 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -53,6 +53,7 @@ import os import re import sys import threading +import time import token import tokenize import types @@ -98,10 +99,13 @@ Modifiers: with '>>>>>> '. -s, --summary Write a brief summary on stdout for each file. (Can only be used with --count or --report.) +-g, --timing Prefix each line with the time since the program started. + Only used while tracing. Filters, may be repeated multiple times: ---ignore-module=<mod> Ignore the given module and its submodules - (if it is a package). +--ignore-module=<mod> Ignore the given module(s) and its submodules + (if it is a package). Accepts comma separated + list of module names --ignore-dir=<dir> Ignore files in the given directory (multiple directories can be joined by os.pathsep). """ % sys.argv[0]) @@ -191,11 +195,13 @@ def fullmodname(path): base = path[len(longest) + 1:] else: base = path + # the drive letter is never part of the module name + drive, base = os.path.splitdrive(base) base = base.replace(os.sep, ".") if os.altsep: base = base.replace(os.altsep, ".") filename, ext = os.path.splitext(base) - return filename + return filename.lstrip(".") class CoverageResults: def __init__(self, counts=None, calledfuncs=None, infile=None, @@ -434,7 +440,8 @@ def find_executable_linenos(filename): class Trace: def __init__(self, count=1, trace=1, countfuncs=0, countcallers=0, - ignoremods=(), ignoredirs=(), infile=None, outfile=None): + ignoremods=(), ignoredirs=(), infile=None, outfile=None, + timing=False): """ @param count true iff it should count number of times each line is executed @@ -450,6 +457,7 @@ class Trace: @param infile file from which to read stored counts to be added into the results @param outfile file in which to write the results + @param timing true iff timing information be displayed """ self.infile = infile self.outfile = outfile @@ -462,6 +470,9 @@ class Trace: self._calledfuncs = {} self._callers = {} self._caller_cache = {} + self.start_time = None + if timing: + self.start_time = time.time() if countcallers: self.globaltrace = self.globaltrace_trackcallers elif countfuncs: @@ -612,6 +623,8 @@ class Trace: key = filename, lineno self.counts[key] = self.counts.get(key, 0) + 1 + if self.start_time: + print '%.2f' % (time.time() - self.start_time), bname = os.path.basename(filename) print "%s(%d): %s" % (bname, lineno, linecache.getline(filename, lineno)), @@ -623,6 +636,8 @@ class Trace: filename = frame.f_code.co_filename lineno = frame.f_lineno + if self.start_time: + print '%.2f' % (time.time() - self.start_time), bname = os.path.basename(filename) print "%s(%d): %s" % (bname, lineno, linecache.getline(filename, lineno)), @@ -652,13 +667,13 @@ def main(argv=None): if argv is None: argv = sys.argv try: - opts, prog_argv = getopt.getopt(argv[1:], "tcrRf:d:msC:lT", + opts, prog_argv = getopt.getopt(argv[1:], "tcrRf:d:msC:lTg", ["help", "version", "trace", "count", "report", "no-report", "summary", "file=", "missing", "ignore-module=", "ignore-dir=", "coverdir=", "listfuncs", - "trackcalls"]) + "trackcalls", "timing"]) except getopt.error, msg: sys.stderr.write("%s: %s\n" % (sys.argv[0], msg)) @@ -678,6 +693,7 @@ def main(argv=None): summary = 0 listfuncs = False countcallers = False + timing = False for opt, val in opts: if opt == "--help": @@ -696,6 +712,10 @@ def main(argv=None): listfuncs = True continue + if opt == "-g" or opt == "--timing": + timing = True + continue + if opt == "-t" or opt == "--trace": trace = 1 continue @@ -729,7 +749,8 @@ def main(argv=None): continue if opt == "--ignore-module": - ignore_modules.append(val) + for mod in val.split(","): + ignore_modules.append(mod.strip()) continue if opt == "--ignore-dir": @@ -777,9 +798,18 @@ def main(argv=None): t = Trace(count, trace, countfuncs=listfuncs, countcallers=countcallers, ignoremods=ignore_modules, ignoredirs=ignore_dirs, infile=counts_file, - outfile=counts_file) + outfile=counts_file, timing=timing) try: - t.run('execfile(%r)' % (progname,)) + with open(progname) as fp: + code = compile(fp.read(), progname, 'exec') + # try to emulate __main__ namespace as much as possible + globs = { + '__file__': progname, + '__name__': '__main__', + '__package__': None, + '__cached__': None, + } + t.runctx(code, globs, globs) except IOError, err: _err_exit("Cannot run file %r because: %s" % (sys.argv[0], err)) except SystemExit: |
