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¶
顯示執行程式執行的函式。
- -T, --trackcalls¶
顯示執行程式暴露的呼叫關係。
修飾符¶
- -C, --coverdir=<dir>¶
報告檔案所在的目錄。
package.module
的覆蓋率報告寫入檔案dir/package/module.cover
。
- -m, --missing¶
在生成帶註釋的列表時,用
>>>>>>
標記未執行的行。
- -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 啟用顯示相對於跟蹤開始時間的 時間戳。
- runctx(cmd, globals=None, locals=None)¶
在定義的全域性和本地環境中,執行命令並使用當前跟蹤引數從執行中收集統計資訊。如果未定義,則 globals 和 locals 預設為空字典。
- results()¶
返回一個
CoverageResults
物件,該物件包含給定Trace
例項之前所有對run
、runctx
和runfunc
的累積結果。不重置累積的跟蹤結果。
- 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_files 為
True
,則會靜默忽略不再存在的檔案覆蓋率計數。否則,缺少的檔案將引發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=".")