From bb3938b5bbc34ed9fc4a4ac768edf9f799a6d0ce Mon Sep 17 00:00:00 2001 From: "Yves.Duprat" Date: Wed, 11 Feb 2026 10:54:19 +0100 Subject: [PATCH 1/2] Initial commit --- Lib/profiling/tracing/__init__.py | 5 +- .../test_sampling_profiler/test_advanced.py | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Lib/profiling/tracing/__init__.py b/Lib/profiling/tracing/__init__.py index bd3cbf299aab3b..6423e8c9f4e93d 100644 --- a/Lib/profiling/tracing/__init__.py +++ b/Lib/profiling/tracing/__init__.py @@ -197,7 +197,10 @@ def main(): # in the module's namespace. globs = module.__dict__ globs.update({ - '__spec__': spec, + # See gh-140729, set None to __spec__ according + # to the documentation, + # https://docs.python.org/3/reference/import.html#module-specs + '__spec__': None, '__file__': spec.origin, '__name__': spec.name, '__package__': None, diff --git a/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py b/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py index 11b1ad84242fd4..67fb3f281e5a97 100644 --- a/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py +++ b/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py @@ -234,3 +234,50 @@ def worker(x): self.assertIn("Results: [2, 4, 6]", stdout) self.assertNotIn("Can't pickle", stderr) + + +@requires_remote_subprocess_debugging() +class TestProcessRunSupport(unittest.TestCase): + """ + Test that Process works correctly with cProfile. + """ + + def test_process_run_pickle(self): + # gh-140729: test use Process in cProfile. + val = 10 + test_script = f''' +import multiprocessing + +def worker(x): + print(__name__) + exit(x ** 2) + +if __name__ == "__main__": + multiprocessing.set_start_method("spawn") + p = multiprocessing.Process(target=worker, args=({val},)) + p.start() + p.join() + print("p.exitcode =", p.exitcode) +''' + + with os_helper.temp_dir() as temp_dir: + script = script_helper.make_script( + temp_dir, 'test_process_run_pickle', test_script + ) + with SuppressCrashReport(): + with script_helper.spawn_python( + "-m", "cProfile", + script, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) as proc: + try: + stdout, stderr = proc.communicate(timeout=SHORT_TIMEOUT) + except subprocess.TimeoutExpired: + proc.kill() + stdout, stderr = proc.communicate() + + self.assertIn("__mp_main__", stdout) + self.assertIn(f"exitcode = {val**2}", stdout) + self.assertNotIn("Can't pickle", stderr) From 0a7badb3d278e110c133ea5f84fa1f128ec53bb2 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:47:32 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst new file mode 100644 index 00000000000000..ce099debc7e67a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -0,0 +1,2 @@ +Fix pickling error in the cProfile module when using ``multiprocessing.Process`` +script, which can not be properly pickled and executed.