trace.rst 6.56 KB
Newer Older
1 2 3 4 5 6
:mod:`trace` --- Trace or track Python statement execution
==========================================================

.. module:: trace
   :synopsis: Trace or track Python statement execution.

7
**Source code:** :source:`Lib/trace.py`
8

9 10
--------------

11 12 13 14 15 16 17
The :mod:`trace` module allows you to trace program execution, generate
annotated statement coverage listings, print caller/callee relationships and
list functions executed during a program run.  It can be used in another program
or from the command line.

.. _trace-cli:

18
Command-Line Usage
19 20 21 22 23
------------------

The :mod:`trace` module can be invoked from the command line.  It can be as
simple as ::

24
   python -m trace --count -C . somefile.py ...
25

26 27
The above will execute :file:`somefile.py` and generate annotated listings of
all Python modules imported during the execution into the current directory.
28

29 30 31 32 33 34 35 36 37 38 39 40 41
.. program:: trace

.. cmdoption:: --help

   Display usage and exit.

.. cmdoption:: --version

   Display the version of the module and exit.

Main options
^^^^^^^^^^^^

42 43
At least one of the following options must be specified when invoking
:mod:`trace`.  The :option:`--listfuncs <-l>` option is mutually exclusive with
44 45
the :option:`--trace <-t>` and :option:`--count <-c>` options. When
:option:`--listfuncs <-l>` is provided, neither :option:`--count <-c>` nor
46
:option:`--trace <-t>` are accepted, and vice versa.
47 48 49 50 51 52

.. program:: trace

.. cmdoption:: -c, --count

   Produce a set of annotated listing files upon program completion that shows
53 54
   how many times each statement was executed.  See also
   :option:`--coverdir <-C>`, :option:`--file <-f>` and
55 56 57
   :option:`--no-report <-R>` below.

.. cmdoption:: -t, --trace
58 59 60

   Display lines as they are executed.

61 62 63 64 65
.. cmdoption:: -l, --listfuncs

   Display the functions executed by running the program.

.. cmdoption:: -r, --report
66 67

   Produce an annotated list from an earlier program run that used the
68 69
   :option:`--count <-c>` and :option:`--file <-f>` option.  This does not
   execute any code.
70

71 72 73 74 75 76
.. cmdoption:: -T, --trackcalls

   Display the calling relationships exposed by running the program.

Modifiers
^^^^^^^^^
77

78
.. program:: trace
79

80
.. cmdoption:: -f, --file=<file>
81

82 83
   Name of a file to accumulate counts over several tracing runs.  Should be
   used with the :option:`--count <-c>` option.
84

85 86
.. cmdoption:: -C, --coverdir=<dir>

87
   Directory where the report files go.  The coverage report for
88 89 90
   ``package.module`` is written to file :file:`{dir}/{package}/{module}.cover`.

.. cmdoption:: -m, --missing
91 92

   When generating annotated listings, mark lines which were not executed with
93
   ``>>>>>>``.
94

95
.. cmdoption:: -s, --summary
96

97 98
   When using :option:`--count <-c>` or :option:`--report <-r>`, write a brief
   summary to stdout for each file processed.
99

100
.. cmdoption:: -R, --no-report
101

102 103 104
   Do not generate annotated listings.  This is useful if you intend to make
   several runs with :option:`--count <-c>`, and then produce a single set of
   annotated listings at the end.
105

106 107
.. cmdoption:: -g, --timing

108
   Prefix each line with the time since the program started.  Only used while
109
   tracing.
110

111 112
Filters
^^^^^^^
113

114 115 116 117 118 119
These options may be repeated multiple times.

.. program:: trace

.. cmdoption:: --ignore-module=<mod>

120 121
   Ignore each of the given module names and its submodules (if it is a
   package).  The argument can be a list of names separated by a comma.
122 123 124 125 126 127 128 129 130 131

.. cmdoption:: --ignore-dir=<dir>

   Ignore all modules and packages in the named directory and subdirectories.
   The argument can be a list of directories separated by :data:`os.pathsep`.

.. _trace-api:

Programmatic Interface
----------------------
132

133 134
.. class:: Trace(count=1, trace=1, countfuncs=0, countcallers=0, ignoremods=(),\
                 ignoredirs=(), infile=None, outfile=None, timing=False)
135

136 137 138 139 140 141 142 143 144 145
   Create an object to trace execution of a single statement or expression.  All
   parameters are optional.  *count* enables counting of line numbers.  *trace*
   enables line execution tracing.  *countfuncs* enables listing of the
   functions called during the run.  *countcallers* enables call relationship
   tracking.  *ignoremods* is a list of modules or packages to ignore.
   *ignoredirs* is a list of directories whose modules or packages should be
   ignored.  *infile* is the name of the file from which to read stored count
   information.  *outfile* is the name of the file in which to write updated
   count information.  *timing* enables a timestamp relative to when tracing was
   started to be displayed.
146

147
    .. method:: run(cmd)
148

149 150 151
       Execute the command and gather statistics from the execution with
       the current tracing parameters.  *cmd* must be a string or code object,
       suitable for passing into :func:`exec`.
152

153
    .. method:: runctx(cmd, globals=None, locals=None)
154

155 156 157 158
       Execute the command and gather statistics from the execution with the
       current tracing parameters, in the defined global and local
       environments.  If not defined, *globals* and *locals* default to empty
       dictionaries.
159

160
    .. method:: runfunc(func, *args, **kwds)
161

162 163
       Call *func* with the given arguments under control of the :class:`Trace`
       object with the current tracing parameters.
164

165
    .. method:: results()
166

167 168 169 170
       Return a :class:`CoverageResults` object that contains the cumulative
       results of all previous calls to ``run``, ``runctx`` and ``runfunc``
       for the given :class:`Trace` instance.  Does not reset the accumulated
       trace results.
171 172 173

.. class:: CoverageResults

174 175
   A container for coverage results, created by :meth:`Trace.results`.  Should
   not be created directly by the user.
176

177
    .. method:: update(other)
178

179
       Merge in data from another :class:`CoverageResults` object.
180

181
    .. method:: write_results(show_missing=True, summary=False, coverdir=None)
182

183 184 185 186 187
       Write coverage results.  Set *show_missing* to show lines that had no
       hits.  Set *summary* to include in the output the coverage summary per
       module.  *coverdir* specifies the directory into which the coverage
       result files will be output.  If ``None``, the results for each source
       file are placed in its directory.
188 189

A simple example demonstrating the use of the programmatic interface::
190 191 192 193 194 195 196 197 198 199 200 201 202 203

   import sys
   import trace

   # create a Trace object, telling it what to ignore, and whether to
   # do tracing or line-counting or both.
   tracer = trace.Trace(
       ignoredirs=[sys.prefix, sys.exec_prefix],
       trace=0,
       count=1)

   # run the new command using the given tracer
   tracer.run('main()')

204
   # make a report, placing output in the current directory
205
   r = tracer.results()
206
   r.write_results(show_missing=True, coverdir=".")
207