diff --git a/Lib/profiling/tracing/__init__.py b/Lib/profiling/tracing/__init__.py index a6b8edf721611f..143573ff747d1b 100644 --- a/Lib/profiling/tracing/__init__.py +++ b/Lib/profiling/tracing/__init__.py @@ -197,7 +197,7 @@ def main(): # in the module's namespace. globs = module.__dict__ globs.update({ - '__spec__': spec, + '__spec__': None, '__file__': spec.origin, '__name__': spec.name, '__package__': None, diff --git a/Lib/test/test_profiling/test_tracing_profiler.py b/Lib/test/test_profiling/test_tracing_profiler.py index d09ca441d4ae46..d4bed67ffe8175 100644 --- a/Lib/test/test_profiling/test_tracing_profiler.py +++ b/Lib/test/test_profiling/test_tracing_profiler.py @@ -2,12 +2,14 @@ import sys import unittest +import subprocess # rip off all interesting stuff from test_profile import profiling.tracing as cProfile import tempfile import textwrap from test.test_profile import ProfileTest, regenerate_expected_output +from test.support import script_helper, os_helper, SHORT_TIMEOUT from test.support.script_helper import assert_python_failure, assert_python_ok from test import support @@ -170,6 +172,41 @@ class Foo: f.close() assert_python_ok('-m', "cProfile", f.name) + @unittest.skipIf(sys.platform == 'win32', + 'Profiler with multiprocessing can not run on win32') + def test_profile_multiprocessing(self): + test_script = ''' +import multiprocessing + +def worker_proc(x): + return x * 42 + +def main_proc(): + p = multiprocessing.Process(target=worker_proc, args=(10,)) + p.start() + p.join() + print("SUCCESS") + +if __name__ == "__main__": + main_proc() +''' + with os_helper.temp_dir() as temp_dir: + script = script_helper.make_script( + temp_dir, 'test_cprofile_multiprocessing', test_script + ) + with script_helper.spawn_python( + "-m", "cProfile", + script, + stderr=subprocess.PIPE, + text=True + ) as proc: + proc.wait(timeout=SHORT_TIMEOUT) + stdout = proc.stdout.read() + stderr = proc.stderr.read() + + self.assertIn("SUCCESS", stdout) + self.assertNotIn("has no attribute \'worker_proc\'", stderr) + def main(): if '-r' not in sys.argv: diff --git a/Misc/NEWS.d/next/Library/2025-11-23-19-06-41.gh-issue-140729.bk_HDs.rst b/Misc/NEWS.d/next/Library/2025-11-23-19-06-41.gh-issue-140729.bk_HDs.rst new file mode 100644 index 00000000000000..0341c43b68eab6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-23-19-06-41.gh-issue-140729.bk_HDs.rst @@ -0,0 +1 @@ +Set ``__main__.__spec__`` to ``None`` when running a script with :mod:`cProfile`