trace
—— 跟蹤 Python 語句的執(zhí)行?
源代碼 : Lib/trace.py
模塊 trace
模塊用于跟蹤程序的執(zhí)行過程,可生成帶注釋的語句覆蓋率列表,打印調(diào)用/被調(diào)用關(guān)系,列出程序運(yùn)行期間執(zhí)行過的函數(shù)。該模塊可在其他程序或命令行中使用。
參見
- Coverage.py
流行的第三方代碼覆蓋工具,可輸出 HTML ,并提供分支覆蓋等高級(jí)功能。
命令行用法?
trace
模塊可由命令行調(diào)用。用法如此簡(jiǎn)單:
python -m trace --count -C . somefile.py ...
上述命令將執(zhí)行 somefile.py
,并在當(dāng)前目錄生成執(zhí)行期間所有已導(dǎo)入 Python 模塊的帶注解列表。
- --help?
顯示用法并退出。
- --version?
顯示模塊版本并退出。
3.8 新版功能: 加入了 --module
選項(xiàng),允許運(yùn)行可執(zhí)行模塊。
主要的可選參數(shù)?
在調(diào)用 trace
時(shí),至少須指定以下可選參數(shù)之一。 -listfuncs
與 -trace
、 -count
相互排斥。如果給出 --listfuncs
,就再不會(huì)接受 --count
和 --trace
,反之亦然。
- -c, --count?
在程序完成時(shí)生成一組帶有注解的報(bào)表文件,顯示每個(gè)語句被執(zhí)行的次數(shù)。 參見下面的
-coverdir
、-file
和-no-report
。
- -t, --trace?
執(zhí)行時(shí)顯示每一行。
- -l, --listfuncs?
顯示程序運(yùn)行時(shí)執(zhí)行到的函數(shù)。
- -T, --trackcalls?
顯示程序運(yùn)行時(shí)暴露出來的調(diào)用關(guān)系。
修飾器?
- -C, --coverdir=<dir>?
報(bào)表文件的所在目錄。
package.module
的覆蓋率報(bào)表將被寫入文件dir/package/module.cover
。
- -m, --missing?
生成帶注解的報(bào)表時(shí),用
>>>>>>
標(biāo)記未執(zhí)行的行。
- -R, --no-report?
不生成帶注解的報(bào)表。如果打算用
--count
執(zhí)行多次運(yùn)行,然后在最后產(chǎn)生一組帶注解的報(bào)表,該選項(xiàng)就很有用。
- -g, --timing?
在每一行前面加上時(shí)間,自程序運(yùn)行算起。只在跟蹤時(shí)有用。
過濾器?
以下參數(shù)可重復(fù)多次。
- --ignore-module=<mod>?
忽略給出的模塊名及其子模塊(若為包)。參數(shù)可為逗號(hào)分隔的名稱列表。
- --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)建一個(gè)對(duì)象來跟蹤單個(gè)語句或表達(dá)式的執(zhí)行。所有參數(shù)均為選填。 count 可對(duì)行號(hào)計(jì)數(shù)。 trace 啟用單行執(zhí)行跟蹤。 countfuncs 可列出運(yùn)行過程中調(diào)用的函數(shù)。 countcallers 可跟蹤調(diào)用關(guān)系。 ignoremods 是要忽略的模塊或包的列表。ignoredirs 是要忽略的模塊或包的目錄列表。 infile 是個(gè)文件名,從該文件中讀取存儲(chǔ)的計(jì)數(shù)信息。 outfile 是用來寫入最新計(jì)數(shù)信息的文件名。 timing 可以顯示相對(duì)于跟蹤開始時(shí)間的時(shí)間戳。
- run(cmd)?
執(zhí)行命令,并根據(jù)當(dāng)前跟蹤參數(shù)從執(zhí)行過程中收集統(tǒng)計(jì)數(shù)據(jù)。 cmd 必須為字符串或 code 對(duì)象,可供傳入
exec()
。
- runctx(cmd, globals=None, locals=None)?
在定義的全局和局部環(huán)境中,執(zhí)行命令并收集當(dāng)前跟蹤參數(shù)下的執(zhí)行統(tǒng)計(jì)數(shù)據(jù)。若沒有定義 globals 和 locals ,則默認(rèn)為空字典。
- runfunc(func, /, *args, **kwds)?
在
Trace
對(duì)象的控制下,用給定的參數(shù)調(diào)用 func,并采用當(dāng)前的跟蹤參數(shù)。
- results()?
返回一個(gè)
CoverageResults
對(duì)象,包含之前對(duì)指定Trace
實(shí)例調(diào)用run
、runctx
和runfunc
的累積結(jié)果。 累積的跟蹤結(jié)果不會(huì)重置。
- class trace.CoverageResults?
存放代碼覆蓋結(jié)果的容器,由
Trace.results()
創(chuàng)建。用戶不應(yīng)直接去創(chuàng)建。- update(other)?
從另一個(gè)
CoverageResults
對(duì)象中合并代碼覆蓋數(shù)據(jù)。
- write_results(show_missing=True, summary=False, coverdir=None)?
寫入代碼覆蓋結(jié)果。設(shè)置 show_missing 可顯示未命中的行。設(shè)置*summary* 可在輸出中包含每個(gè)模塊的覆蓋率摘要信息。 coverdir 可指定覆蓋率結(jié)果文件的輸出目錄,為
None
則結(jié)果將置于源文件所在目錄中。
以下例子簡(jiǎn)單演示了編程接口的用法:
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=".")