11import multiprocessing
2+ import queue # for Empty
23import subprocess # nosec B404
34import sys
45import traceback
@@ -41,7 +42,7 @@ def __call__(self):
4142def run_python_code_safely (python_code , * , timeout = None ):
4243 """Run Python code in a spawned subprocess, capturing stdout/stderr/output."""
4344 ctx = multiprocessing .get_context ("spawn" )
44- result_queue = ctx .SimpleQueue ()
45+ result_queue = ctx .Queue ()
4546 process = ctx .Process (target = Worker (python_code , result_queue ))
4647 process .start ()
4748
@@ -57,15 +58,16 @@ def run_python_code_safely(python_code, *, timeout=None):
5758 stderr = f"Process timed out after { timeout } seconds and was terminated." ,
5859 )
5960
60- if result_queue .empty ():
61+ try :
62+ returncode , stdout , stderr = result_queue .get (timeout = 1.0 )
63+ except (queue .Empty , EOFError ):
6164 return subprocess .CompletedProcess (
6265 args = [sys .executable , "-c" , python_code ],
6366 returncode = - 999 ,
6467 stdout = "" ,
65- stderr = "Process exited without returning results." ,
68+ stderr = "Process exited or crashed before returning results." ,
6669 )
6770
68- returncode , stdout , stderr = result_queue .get ()
6971 return subprocess .CompletedProcess (
7072 args = [sys .executable , "-c" , python_code ],
7173 returncode = returncode ,
0 commit comments