mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
18 lines
20 KiB
HTML
18 lines
20 KiB
HTML
<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">=<file></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">=<dir></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">>>>>>></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">=<mod></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">=<dir></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> |