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 時,為每個處理的檔案向標準輸出寫入一份簡要摘要。

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