https://github.com/python/cpython/commit/7f6389f48ee46df91e562d33564d02747b3f7ca3
commit: 7f6389f48ee46df91e562d33564d02747b3f7ca3
branch: main
author: tonghuaroot (童话) <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-08-20T11:40:26+03:00
summary:
gh-152409: Save the trace --file counts when --no-report is used (GH-152410)
The counts were only persisted at the end of CoverageResults.write_results(),
which main() skips when --no-report is given, so --no-report --file silently
discarded them.
files:
A Misc/NEWS.d/next/Library/2026-06-27-10-30-00.gh-issue-152409.Tr8cE2.rst
M Lib/test/test_trace.py
M Lib/trace.py
diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py
index 19eee19bdea6d5..241e841d732f5e 100644
--- a/Lib/test/test_trace.py
+++ b/Lib/test/test_trace.py
@@ -1,5 +1,5 @@
import os
-from pickle import dump
+from pickle import dump, load
import sys
from test.support import captured_stdout, requires_resource
from test.support.os_helper import (TESTFN, rmtree, unlink)
@@ -561,6 +561,28 @@ def f():
self.assertIn('lines cov% module (path)', stdout)
self.assertIn(f'6 100.0% {modulename} ({filename})', stdout)
+ def test_count_no_report_accumulates_counts(self):
+ # --no-report must still save the --file counts so they accumulate.
+ filename = f'{TESTFN}.py'
+ countsfile = f'{TESTFN}.counts'
+ with open(filename, 'w', encoding='utf-8') as fd:
+ self.addCleanup(unlink, filename)
+ self.addCleanup(unlink, countsfile)
+ fd.write('for i in range(3):\n pass\n')
+ argv = ('-m', 'trace', '--count', '--no-report',
+ '--file', countsfile, filename)
+ assert_python_ok(*argv, PYTHONIOENCODING='utf-8')
+ self.assertTrue(os.path.exists(countsfile))
+ with open(countsfile, 'rb') as fd:
+ counts = load(fd)[0]
+ self.assertTrue(counts)
+ # A second run accumulates into the same file.
+ assert_python_ok(*argv, PYTHONIOENCODING='utf-8')
+ with open(countsfile, 'rb') as fd:
+ accumulated = load(fd)[0]
+ self.assertEqual(accumulated,
+ {key: 2 * value for key, value in counts.items()})
+
def test_run_as_module(self):
assert_python_ok('-m', 'trace', '-l', '--module', 'timeit', '-n', '1')
assert_python_failure('-m', 'trace', '-l', '--module',
'not_a_module_zzz')
diff --git a/Lib/trace.py b/Lib/trace.py
index 43ec201c4696d1..66471f45e1c004 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -287,8 +287,11 @@ def write_results(self, show_missing=True, summary=False,
coverdir=None, *,
n_lines, n_hits, modulename, filename = sums[m]
print(f"{n_lines:5d} {n_hits/n_lines:.1%} {modulename}
({filename})")
+ self._save_counts()
+
+ def _save_counts(self):
+ """Save the accumulated counts to ``self.outfile`` if one was given."""
if self.outfile:
- # try and store counts and module info into self.outfile
try:
with open(self.outfile, 'wb') as f:
pickle.dump((self.counts, self.calledfuncs, self.callers),
@@ -744,6 +747,8 @@ def parse_ignore_dir(s):
if not opts.no_report:
results.write_results(opts.missing, opts.summary, opts.coverdir)
+ else:
+ results._save_counts()
if __name__=='__main__':
main()
diff --git
a/Misc/NEWS.d/next/Library/2026-06-27-10-30-00.gh-issue-152409.Tr8cE2.rst
b/Misc/NEWS.d/next/Library/2026-06-27-10-30-00.gh-issue-152409.Tr8cE2.rst
new file mode 100644
index 00000000000000..2e6a759a102e66
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-06-27-10-30-00.gh-issue-152409.Tr8cE2.rst
@@ -0,0 +1,3 @@
+Fix the :mod:`trace` command-line tool not saving the ``--file`` counts
+when ``--no-report`` is used, which prevented accumulating counts over
+several runs. Patch by tonghuaroot.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]