trace — 跟蹤或追溯 Python 語句的執行

原始碼: Lib/trace.py


trace 模組允許你跟蹤程式執行,生成帶註釋的語句覆蓋率列表,列印呼叫者/被呼叫者關係,並列出程式執行期間執行的函式。它可以用於另一個程式或從命令列使用。

另請參閱

Coverage.py

一個流行的第三方覆蓋率工具,提供 HTML 輸出以及諸如分支覆蓋率等高階功能。

命令列用法

可以從命令列呼叫 trace 模組。它可以像下面這樣簡單:

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

以上命令將執行 somefile.py,並在當前目錄下生成執行期間匯入的所有 Python 模組的帶註釋列表。

--help

顯示用法並退出。

--version

顯示模組版本並退出。

3.8 版本新增: 添加了 --module 選項,允許執行可執行模組。

主要選項

在呼叫 trace 時,必須至少指定以下選項之一。--listfuncs 選項與 --trace--count 選項互斥。當提供 --listfuncs 時,--count--trace 均不接受,反之亦然。

-c, --count

在程式完成後生成一組帶註釋的列表檔案,顯示每個語句執行的次數。另請參閱下面的 --coverdir--file--no-report

-t, --trace

顯示執行的行。

-l, --listfuncs

顯示執行程式執行的函式。

-r, --report

從先前使用 --count--file 選項的程式執行中生成帶註釋的列表。這不執行任何程式碼。

-T, --trackcalls

顯示執行程式暴露的呼叫關係。

修飾符

-f, --file=<file>

用於累積多次跟蹤執行的計數的檔名。應與 --count 選項一起使用。

-C, --coverdir=<dir>

報告檔案所在的目錄。package.module 的覆蓋率報告寫入檔案 dir/package/module.cover

-m, --missing

在生成帶註釋的列表時,用 >>>>>> 標記未執行的行。

-s, --summary

當使用 --count--report 時,為處理的每個檔案在 stdout 中寫入一個簡短的摘要。

-R, --no-report

不生成帶註釋的列表。如果你打算使用 --count 進行多次執行,然後在最後生成一組帶註釋的列表,則此選項很有用。

-g, --timing

在每行的開頭新增程式啟動以來的時間。僅在跟蹤時使用。

過濾器

這些選項可以重複多次。

--ignore-module=<mod>

忽略每個給定的模組名稱及其子模組(如果它是一個包)。引數可以是逗號分隔的名稱列表。

--ignore-dir=<dir>

忽略指定目錄和子目錄中的所有模組和包。引數可以是 os.pathsep 分隔的目錄列表。

程式化介面

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

建立一個物件來跟蹤單個語句或表示式的執行。所有引數都是可選的。count 啟用行號計數。trace 啟用行執行跟蹤。countfuncs 啟用在執行期間呼叫的函式列表。countcallers 啟用呼叫關係跟蹤。ignoremods 是要忽略的模組或包的列表。ignoredirs 是應忽略其模組或包的目錄列表。infile 是從中讀取儲存的計數資訊的檔名。outfile 是在其中寫入更新的計數資訊的檔名。timing 啟用顯示相對於跟蹤開始時間的 時間戳。

run(cmd)

執行命令並使用當前跟蹤引數從執行中收集統計資訊。cmd 必須是字串或程式碼物件,適合傳遞給 exec()

runctx(cmd, globals=None, locals=None)

在定義的全域性和本地環境中,執行命令並使用當前跟蹤引數從執行中收集統計資訊。如果未定義,則 globalslocals 預設為空字典。

runfunc(func, /, *args, **kwds)

在當前跟蹤引數的 Trace 物件的控制下,使用給定引數呼叫 func

results()

返回一個 CoverageResults 物件,該物件包含給定 Trace 例項之前所有對 runrunctxrunfunc 的累積結果。不重置累積的跟蹤結果。

class trace.CoverageResults

Trace.results() 建立的覆蓋率結果的容器。不應由使用者直接建立。

update(other)

合併來自另一個 CoverageResults 物件的資料。

write_results(show_missing=True, summary=False, coverdir=None, *, ignore_missing_files=False)

寫入覆蓋率結果。設定 show_missing 以顯示沒有命中的行。設定 summary 以在輸出中包含每個模組的覆蓋率摘要。coverdir 指定覆蓋率結果檔案將輸出到的目錄。如果為 None,則每個原始檔的結果都將放置在其目錄中。

如果 ignore_missing_filesTrue,則會靜默忽略不再存在的檔案覆蓋率計數。否則,缺少的檔案將引發 FileNotFoundError

3.13 版本更改: 添加了 ignore_missing_files 引數。

一個簡單的示例,演示了程式化介面的使用

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=".")