trace --- 跟蹤Python語句執行?
源代碼: Lib/trace.py
模塊 trace module 允許你跟蹤程序的執行過程,生成帶注釋的語句覆蓋率列表,打印調用/被調用關系以及列出在程序運行期間執行過的函數。可以在其他程序或者命令行中使用它
參見
- Coverage.py
流行的第三方代碼覆蓋工具,可輸出 HTML ,并提供分支覆蓋等高級功能。
命令行用法?
trace 模塊可由命令行調用。用法如此簡單:
python -m trace --count -C . somefile.py ...
上述命令將執行 somefile.py ,并在當前目錄生成執行期間所有已導入 Python 模塊的帶注釋列表。
-
--help? 顯示用法并退出。
-
--version? 顯示模塊版本并退出。
主要的可選參數?
在調用 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)? 寫入代碼覆蓋結果。設置 show_missing 可顯示未命中的行。設置*summary* 可在輸出中包含每個模塊的覆蓋率摘要信息。 coverdir 可指定覆蓋率結果文件的輸出目錄,為
None則結果將置于源文件所在目錄中。
-
以下例子簡單演示了編程接口的用法:
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=".")
