:mod:`!trace` --- Trace or track Python statement execution
===========================================================

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

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

--------------

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.

.. seealso::

   `Coverage.py <https://coverage.readthedocs.io/>`_
      A popular third-party coverage tool that provides HTML
      output along with advanced features such as branch coverage.

.. _trace-cli:

Command-Line Usage
------------------

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

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

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

.. program:: trace

.. option:: --help

   Display usage and exit.

.. option:: --version

   Display the version of the module and exit.

.. versionadded:: 3.8
    Added ``--module`` option that allows to run an executable module.

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

At least one of the following options must be specified when invoking
:mod:`trace`.  The :option:`--listfuncs <-l>` option is mutually exclusive with
the :option:`--trace <-t>` and :option:`--count <-c>` options. When
:option:`--listfuncs <-l>` is provided, neither :option:`--count <-c>` nor
:option:`--trace <-t>` are accepted, and vice versa.

.. program:: trace

.. option:: -c, --count

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

.. option:: -t, --trace

   Display lines as they are executed.

.. option:: -l, --listfuncs

   Display the functions executed by running the program.

.. option:: -r, --report

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

.. option:: -T, --trackcalls

   Display the calling relationships exposed by running the program.

Modifiers
^^^^^^^^^

.. program:: trace

.. option:: -f, --file=<file>

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

.. option:: -C, --coverdir=<dir>

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

.. option:: -m, --missing

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

.. option:: -s, --summary

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

.. option:: -R, --no-report

   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.

.. option:: -g, --timing

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

Filters
^^^^^^^

These options may be repeated multiple times.

.. program:: trace

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

   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.

.. option:: --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
----------------------

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

   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.

   .. method:: run(cmd)

      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`.

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

      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.

   .. method:: runfunc(func, /, *args, **kwds)

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

   .. method:: results()

      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.

.. class:: CoverageResults

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

   .. method:: update(other)

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

   .. method:: write_results(show_missing=True, summary=False, coverdir=None,\
                             *, ignore_missing_files=False)

      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.

      If *ignore_missing_files* is ``True``, coverage counts for files that no
      longer exist are silently ignored. Otherwise, a missing file will
      raise a :exc:`FileNotFoundError`.

      .. versionchanged:: 3.13
         Added *ignore_missing_files* parameter.

A simple example demonstrating the use of the programmatic interface::

   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()')

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

