trace —— 跟蹤 Python 語句的執(zhí)行?

源代碼Lib/trace.py


模塊 trace 模塊用于跟蹤程序的執(zhí)行過程,可生成帶注釋的語句覆蓋率列表,打印調(diào)用/被調(diào)用關(guān)系,列出程序運行期間執(zhí)行過的函數(shù)。該模塊可在其他程序或命令行中使用。

參見

Coverage.py

流行的第三方代碼覆蓋工具,可輸出 HTML ,并提供分支覆蓋等高級功能。

命令行用法?

trace 模塊可由命令行調(diào)用。用法如此簡單:

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

上述命令將執(zhí)行 somefile.py ,并在當前目錄生成執(zhí)行期間所有已導入 Python 模塊的帶注解列表。

--help?

顯示用法并退出。

--version?

顯示模塊版本并退出。

3.8 新版功能: 加入了 --module 選項,允許運行可執(zhí)行模塊。

主要的可選參數(shù)?

在調(diào)用 trace 時,至少須指定以下可選參數(shù)之一。 -listfuncs-trace 、 -count 相互排斥。如果給出 --listfuncs,就再不會接受 --count--trace ,反之亦然。

-c, --count?

在程序完成時生成一組帶有注解的報表文件,顯示每個語句被執(zhí)行的次數(shù)。 參見下面的 -coverdir 、-file-no-report

-t, --trace?

執(zhí)行時顯示每一行。

-l, --listfuncs?

顯示程序運行時執(zhí)行到的函數(shù)。

-r, --report?

由之前用了 --count--file 運行的程序產(chǎn)生一個帶有注解的報表。 不會執(zhí)行代碼。

-T, --trackcalls?

顯示程序運行時暴露出來的調(diào)用關(guān)系。

修飾器?

-f, --file=<file>?

用于累計多次跟蹤運行計數(shù)的文件名。應(yīng)與 --count 一起使用。

-C, --coverdir=<dir>?

報表文件的所在目錄。package.module 的覆蓋率報表將被寫入文件 dir/package/module.cover。

-m, --missing?

生成帶注解的報表時,用 >>>>>> 標記未執(zhí)行的行。

-s, --summary?

在用到 --count--report 時,將每個文件的簡短摘要輸出到 stdout。

-R, --no-report?

不生成帶注解的報表。如果打算用 --count 執(zhí)行多次運行,然后在最后產(chǎn)生一組帶注解的報表,該選項就很有用。

-g, --timing?

在每一行前面加上時間,自程序運行算起。只在跟蹤時有用。

過濾器?

以下參數(shù)可重復多次。

--ignore-module=<mod>?

忽略給出的模塊名及其子模塊(若為包)。參數(shù)可為逗號分隔的名稱列表。

--ignore-dir=<dir>?

忽略指定目錄及其子目錄下的所有模塊和包。參數(shù)可為 os.pathsep 分隔的目錄列表。

編程接口?

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

創(chuàng)建一個對象來跟蹤單個語句或表達式的執(zhí)行。所有參數(shù)均為選填。 count 可對行號計數(shù)。 trace 啟用單行執(zhí)行跟蹤。 countfuncs 可列出運行過程中調(diào)用的函數(shù)。 countcallers 可跟蹤調(diào)用關(guān)系。 ignoremods 是要忽略的模塊或包的列表。ignoredirs 是要忽略的模塊或包的目錄列表。 infile 是個文件名,從該文件中讀取存儲的計數(shù)信息。 outfile 是用來寫入最新計數(shù)信息的文件名。 timing 可以顯示相對于跟蹤開始時間的時間戳。

run(cmd)?

執(zhí)行命令,并根據(jù)當前跟蹤參數(shù)從執(zhí)行過程中收集統(tǒng)計數(shù)據(jù)。 cmd 必須為字符串或 code 對象,可供傳入 exec()。

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

在定義的全局和局部環(huán)境中,執(zhí)行命令并收集當前跟蹤參數(shù)下的執(zhí)行統(tǒng)計數(shù)據(jù)。若沒有定義 globalslocals ,則默認為空字典。

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

Trace 對象的控制下,用給定的參數(shù)調(diào)用 func,并采用當前的跟蹤參數(shù)。

results()?

返回一個 CoverageResults 對象,包含之前對指定 Trace 實例調(diào)用 run、runctxrunfunc 的累積結(jié)果。 累積的跟蹤結(jié)果不會重置。

class trace.CoverageResults?

存放代碼覆蓋結(jié)果的容器,由 Trace.results() 創(chuàng)建。用戶不應(yīng)直接去創(chuàng)建。

update(other)?

從另一個 CoverageResults 對象中合并代碼覆蓋數(shù)據(jù)。

write_results(show_missing=True, summary=False, coverdir=None)?

寫入代碼覆蓋結(jié)果。設(shè)置 show_missing 可顯示未命中的行。設(shè)置*summary* 可在輸出中包含每個模塊的覆蓋率摘要信息。 coverdir 可指定覆蓋率結(jié)果文件的輸出目錄,為 None 則結(jié)果將置于源文件所在目錄中。

以下例子簡單演示了編程接口的用法:

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