2019-04-21 11:50:48 +08:00

18 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-trace"><h1><span class="yiyi-st" id="yiyi-10">27.6. <a class="reference internal" href="#module-trace" title="trace: Trace or track Python statement execution."><code class="xref py py-mod docutils literal"><span class="pre">trace</span></code></a> - 跟踪或跟踪Python语句执行</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/trace.py">Lib / trace.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-trace" title="trace: Trace or track Python statement execution."><code class="xref py py-mod docutils literal"><span class="pre">trace</span></code></a>模块允许您跟踪程序执行,生成带注释的语句覆盖率列表,打印调用程序/被调用者关系和在程序运行期间执行的列表函数。</span><span class="yiyi-st" id="yiyi-13">它可以用在另一个程序中或从命令行。</span></p><div class="section" id="command-line-usage"><h2><span class="yiyi-st" id="yiyi-14">27.6.1. </span><span class="yiyi-st" id="yiyi-15">Command-Line Usage</span></h2><p><span class="yiyi-st" id="yiyi-16">可以从命令行调用<a class="reference internal" href="#module-trace" title="trace: Trace or track Python statement execution."><code class="xref py py-mod docutils literal"><span class="pre">trace</span></code></a>模块。</span><span class="yiyi-st" id="yiyi-17">它可以是一样简单</span></p><pre><code class="language-python"><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">trace</span> <span class="o">--</span><span class="n">count</span> <span class="o">-</span><span class="n">C</span> <span class="o">.</span> <span class="n">somefile</span><span class="o">.</span><span class="n">py</span> <span class="o">...</span>
</code></pre><p><span class="yiyi-st" id="yiyi-18">上面将执行<code class="file docutils literal"><span class="pre">somefile.py</span></code>并生成在执行到当前目录期间导入的所有Python模块的注释列表。</span></p><dl class="cmdoption"><dt id="cmdoption-trace--help"><span class="yiyi-st" id="yiyi-19"> <code class="descname">--help</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-20">显示用法并退出。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace--version"><span class="yiyi-st" id="yiyi-21"> <code class="descname">--version</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-22">显示模块和退出的版本。</span></p></dd></dl><div class="section" id="main-options"><h3><span class="yiyi-st" id="yiyi-23">27.6.1.1. </span><span class="yiyi-st" id="yiyi-24">Main options</span></h3><p><span class="yiyi-st" id="yiyi-25">调用<a class="reference internal" href="#module-trace" title="trace: Trace or track Python statement execution."><code class="xref py py-mod docutils literal"><span class="pre">trace</span></code></a>时,必须至少指定以下选项之一。</span><span class="yiyi-st" id="yiyi-26"><a class="reference internal" href="#cmdoption-trace-l"><code class="xref std std-option docutils literal"><span class="pre">--listfuncs</span></code></a>选项与<a class="reference internal" href="#cmdoption-trace-t"><code class="xref std std-option docutils literal"><span class="pre">--trace</span></code></a><a class="reference internal" href="#cmdoption-trace-c"><code class="xref std std-option docutils literal"><span class="pre">--count</span></code></a>选项互斥。</span><span class="yiyi-st" id="yiyi-27">当提供<a class="reference internal" href="#cmdoption-trace-l"><code class="xref std std-option docutils literal"><span class="pre">--listfuncs</span></code></a>时,既不接受<a class="reference internal" href="#cmdoption-trace-c"><code class="xref std std-option docutils literal"><span class="pre">--count</span></code></a>也不接受<a class="reference internal" href="#cmdoption-trace-t"><code class="xref std std-option docutils literal"><span class="pre">--trace</span></code></a>,反之亦然。</span></p><dl class="cmdoption"><dt id="cmdoption-trace-c"><span class="yiyi-st" id="yiyi-28"> <span id="cmdoption-trace--count"></span><code class="descname">-c</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--count</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-29">制作一套显示多少次每个语句的程序完成后的附加说明的清单文件。</span><span class="yiyi-st" id="yiyi-30">另请参阅下面的<a class="reference internal" href="#cmdoption-trace-C"><code class="xref std std-option docutils literal"><span class="pre">--coverdir</span></code></a><a class="reference internal" href="#cmdoption-trace-f"><code class="xref std std-option docutils literal"><span class="pre">--file</span></code></a><a class="reference internal" href="#cmdoption-trace-R"><code class="xref std std-option docutils literal"><span class="pre">--no-report</span></code></a></span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-t"><span class="yiyi-st" id="yiyi-31"> <span id="cmdoption-trace--trace"></span><code class="descname">-t</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--trace</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">显示行,随着它们的执行。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-l"><span class="yiyi-st" id="yiyi-33"> <span id="cmdoption-trace--listfuncs"></span><code class="descname">-l</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--listfuncs</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">显示由运行程序执行的函数。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-r"><span class="yiyi-st" id="yiyi-35"> <span id="cmdoption-trace--report"></span><code class="descname">-r</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--report</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-36">使用<a class="reference internal" href="#cmdoption-trace-c"><code class="xref std std-option docutils literal"><span class="pre">--count</span></code></a><a class="reference internal" href="#cmdoption-trace-f"><code class="xref std std-option docutils literal"><span class="pre">--file</span></code></a>选项从早期程序运行生成带注释的列表。</span><span class="yiyi-st" id="yiyi-37">这不会执行任何代码。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-T"><span class="yiyi-st" id="yiyi-38"> <span id="cmdoption-trace--trackcalls"></span><code class="descname">-T</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--trackcalls</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">显示由运行程序公开的调用关系。</span></p></dd></dl></div><div class="section" id="modifiers"><h3><span class="yiyi-st" id="yiyi-40">27.6.1.2. </span><span class="yiyi-st" id="yiyi-41">Modifiers</span></h3><dl class="cmdoption"><dt id="cmdoption-trace-f"><span class="yiyi-st" id="yiyi-42"> <span id="cmdoption-trace--file"></span><code class="descname">-f</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--file</code><code class="descclassname">=&lt;file&gt;</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-43">要在几个跟踪运行积累计数的文件的名称。</span><span class="yiyi-st" id="yiyi-44">应与<a class="reference internal" href="#cmdoption-trace-c"><code class="xref std std-option docutils literal"><span class="pre">--count</span></code></a>选项一起使用。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-C"><span class="yiyi-st" id="yiyi-45"> <span id="cmdoption-trace--coverdir"></span><code class="descname">-C</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--coverdir</code><code class="descclassname">=&lt;dir&gt;</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-46">在哪里报告文件的目录。</span><span class="yiyi-st" id="yiyi-47"><code class="docutils literal"><span class="pre">package.module</span></code>的覆盖率报告写入文件<code class="file docutils literal"><em><span class="pre">dir</span></em> <span class="pre">/</span> <em><span class="pre">package</span></em> <span class="pre">/ <em><span class="pre">module</span></em><span class="pre">cover</span></span></code></span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-m"><span class="yiyi-st" id="yiyi-48"> <span id="cmdoption-trace--missing"></span><code class="descname">-m</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--missing</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-49">生成带注释的列表时,请标记未使用<code class="docutils literal"><span class="pre">&gt;&gt;&gt;&gt;&gt;&gt;</span></code>执行的行。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-s"><span class="yiyi-st" id="yiyi-50"> <span id="cmdoption-trace--summary"></span><code class="descname">-s</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--summary</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-51">当使用<a class="reference internal" href="#cmdoption-trace-c"><code class="xref std std-option docutils literal"><span class="pre">--count</span></code></a><a class="reference internal" href="#cmdoption-trace-r"><code class="xref std std-option docutils literal"><span class="pre">--report</span></code></a>为每个处理的文件写入一个简短摘要到stdout。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-R"><span class="yiyi-st" id="yiyi-52"> <span id="cmdoption-trace--no-report"></span><code class="descname">-R</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--no-report</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">不会产生附加说明的清单。</span><span class="yiyi-st" id="yiyi-54">如果您打算使用<a class="reference internal" href="#cmdoption-trace-c"><code class="xref std std-option docutils literal"><span class="pre">--count</span></code></a>进行多个运行,然后在末尾生成一组带注释的列表,这将非常有用。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace-g"><span class="yiyi-st" id="yiyi-55"> <span id="cmdoption-trace--timing"></span><code class="descname">-g</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--timing</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">自项目开始以来的前缀与时俱进的每一行。</span><span class="yiyi-st" id="yiyi-57">仅用于跟踪时。</span></p></dd></dl></div><div class="section" id="filters"><h3><span class="yiyi-st" id="yiyi-58">27.6.1.3. </span><span class="yiyi-st" id="yiyi-59">Filters</span></h3><p><span class="yiyi-st" id="yiyi-60">这些选项可能会重复多次。</span></p><dl class="cmdoption"><dt id="cmdoption-trace--ignore-module"><span class="yiyi-st" id="yiyi-61"> <code class="descname">--ignore-module</code><code class="descclassname">=&lt;mod&gt;</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-62">每个给定的模块名称和其模忽略 (如果它是一个包)。</span><span class="yiyi-st" id="yiyi-63">参数可以是以逗号分隔的名称的列表。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-trace--ignore-dir"><span class="yiyi-st" id="yiyi-64"> <code class="descname">--ignore-dir</code><code class="descclassname">=&lt;dir&gt;</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-65">忽略所有的模块和命名的目录和子目录中的包。</span><span class="yiyi-st" id="yiyi-66">参数可以是由<a class="reference internal" href="os.html#os.pathsep" title="os.pathsep"><code class="xref py py-data docutils literal"><span class="pre">os.pathsep</span></code></a>分隔的目录列表。</span></p></dd></dl></div></div><div class="section" id="programmatic-interface"><h2><span class="yiyi-st" id="yiyi-67">27.6.2. </span><span class="yiyi-st" id="yiyi-68">Programmatic Interface</span></h2><dl class="class"><dt id="trace.Trace"><span class="yiyi-st" id="yiyi-69"> <em class="property">class </em><code class="descclassname">trace.</code><code class="descname">Trace</code><span class="sig-paren">(</span><em>count=1</em>, <em>trace=1</em>, <em>countfuncs=0</em>, <em>countcallers=0</em>, <em>ignoremods=()</em>, <em>ignoredirs=()</em>, <em>infile=None</em>, <em>outfile=None</em>, <em>timing=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-70">创建跟踪执行单个语句或表达式的对象。</span><span class="yiyi-st" id="yiyi-71">所有参数都是可选的。</span><span class="yiyi-st" id="yiyi-72"><em>计数</em>,使计数的行号。</span><span class="yiyi-st" id="yiyi-73"><em>跟踪</em>启用行执行跟踪。</span><span class="yiyi-st" id="yiyi-74"><em>countfuncs</em>使上市期间调用的函数中运行。</span><span class="yiyi-st" id="yiyi-75"><em>countcallers</em>使调用关系跟踪。</span><span class="yiyi-st" id="yiyi-76"><em>ignoremods</em>是一个模块或忽视的包的列表。</span><span class="yiyi-st" id="yiyi-77"><em>ignoredirs</em>是应忽略其模块或软件包的目录列表。</span><span class="yiyi-st" id="yiyi-78"><em>infile</em>是要从中读取存储的计数信息文件的名称。</span><span class="yiyi-st" id="yiyi-79"><em>文件的输出</em>是文件的在其中写入更新的计数信息的名称。</span><span class="yiyi-st" id="yiyi-80">时已启动跟踪显示,<em>定时</em>启用相对于一个时间戳。</span></p><span class="yiyi-st" id="yiyi-81"> <blockquote> <div><dl class="method"> <dt id="trace.Trace.run"> <code class="descname">run</code><span class="sig-paren">(</span><em>cmd</em><span class="sig-paren">)</span></dt> <dd><p>Execute the command and gather statistics from the execution with the current tracing parameters. <em>cmd</em> must be a string or code object, suitable for passing into <a class="reference internal" href="functions.html#exec" title="exec"><code class="xref py py-func docutils literal"><span class="pre">exec()</span></code></a>.</p> </dd></dl> <dl class="method"> <dt id="trace.Trace.runctx"> <code class="descname">runctx</code><span class="sig-paren">(</span><em>cmd</em>, <em>globals=None</em>, <em>locals=None</em><span class="sig-paren">)</span></dt> <dd><p>Execute the command and gather statistics from the execution with the current tracing parameters, in the defined global and local environments. If not defined, <em>globals</em> and <em>locals</em> default to empty dictionaries.</p> </dd></dl> <dl class="method"> <dt id="trace.Trace.runfunc"> <code class="descname">runfunc</code><span class="sig-paren">(</span><em>func</em>, <em>*args</em>, <em>**kwds</em><span class="sig-paren">)</span></dt> <dd><p>Call <em>func</em> with the given arguments under control of the <a class="reference internal" href="#trace.Trace" title="trace.Trace"><code class="xref py py-class docutils literal"><span class="pre">Trace</span></code></a> object with the current tracing parameters.</p> </dd></dl> <dl class="method"> <dt id="trace.Trace.results"> <code class="descname">results</code><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> <dd><p>Return a <a class="reference internal" href="#trace.CoverageResults" title="trace.CoverageResults"><code class="xref py py-class docutils literal"><span class="pre">CoverageResults</span></code></a> object that contains the cumulative results of all previous calls to <code class="docutils literal"><span class="pre">run</span></code>, <code class="docutils literal"><span class="pre">runctx</span></code> and <code class="docutils literal"><span class="pre">runfunc</span></code> for the given <a class="reference internal" href="#trace.Trace" title="trace.Trace"><code class="xref py py-class docutils literal"><span class="pre">Trace</span></code></a> instance. Does not reset the accumulated trace results.</p> </dd></dl> </div></blockquote></span></dd></dl><dl class="class"><dt id="trace.CoverageResults"><span class="yiyi-st" id="yiyi-82"> <em class="property">class </em><code class="descclassname">trace.</code><code class="descname">CoverageResults</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-83"><a class="reference internal" href="#trace.Trace.results" title="trace.Trace.results"><code class="xref py py-meth docutils literal"><span class="pre">Trace.results()</span></code></a>创建的覆盖结果容器。</span><span class="yiyi-st" id="yiyi-84">不应直接由用户创建。</span></p><span class="yiyi-st" id="yiyi-85"> <blockquote> <div><dl class="method"> <dt id="trace.CoverageResults.update"> <code class="descname">update</code><span class="sig-paren">(</span><em>other</em><span class="sig-paren">)</span></dt> <dd><p>Merge in data from another <a class="reference internal" href="#trace.CoverageResults" title="trace.CoverageResults"><code class="xref py py-class docutils literal"><span class="pre">CoverageResults</span></code></a> object.</p> </dd></dl> <dl class="method"> <dt id="trace.CoverageResults.write_results"> <code class="descname">write_results</code><span class="sig-paren">(</span><em>show_missing=True</em>, <em>summary=False</em>, <em>coverdir=None</em><span class="sig-paren">)</span></dt> <dd><p>Write coverage results. Set <em>show_missing</em> to show lines that had no hits. Set <em>summary</em> to include in the output the coverage summary per module. <em>coverdir</em> specifies the directory into which the coverage result files will be output. If <code class="docutils literal"><span class="pre">None</span></code>, the results for each source file are placed in its directory.</p> </dd></dl> </div></blockquote></span></dd></dl><p><span class="yiyi-st" id="yiyi-86">一个简单的示例演示使用的编程接口:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">trace</span>
<span class="c1"># create a Trace object, telling it what to ignore, and whether to</span>
<span class="c1"># do tracing or line-counting or both.</span>
<span class="n">tracer</span> <span class="o">=</span> <span class="n">trace</span><span class="o">.</span><span class="n">Trace</span><span class="p">(</span>
<span class="n">ignoredirs</span><span class="o">=</span><span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">prefix</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">exec_prefix</span><span class="p">],</span>
<span class="n">trace</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">count</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># run the new command using the given tracer</span>
<span class="n">tracer</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">'main()'</span><span class="p">)</span>
<span class="c1"># make a report, placing output in the current directory</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">tracer</span><span class="o">.</span><span class="n">results</span><span class="p">()</span>
<span class="n">r</span><span class="o">.</span><span class="n">write_results</span><span class="p">(</span><span class="n">show_missing</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">coverdir</span><span class="o">=</span><span class="s2">"."</span><span class="p">)</span>
</code></pre></div></div></div>