Spaces:
Build error
Build error
import io | |
import sys | |
import ast | |
from logger import logger | |
def run_code(code): | |
""" | |
Executes user-provided Python code and captures its output. | |
Detects function definitions and provides feedback if functions are not invoked. | |
Parameters: | |
code (str): Python code entered by the user. | |
Returns: | |
str: Captured output or error messages. | |
""" | |
# Redirect stdout to capture code output | |
old_stdout = sys.stdout | |
redirected_output = sys.stdout = io.StringIO() | |
# Create a dedicated execution namespace | |
exec_globals = {} | |
try: | |
# Parse the code to detect function definitions | |
tree = ast.parse(code) | |
function_names = [ | |
node.name for node in ast.walk(tree) if isinstance(node, ast.FunctionDef) | |
] | |
# Execute the code in the dedicated namespace | |
exec(code, exec_globals) | |
# Check if functions are defined but not called | |
if function_names: | |
captured_output = redirected_output.getvalue() | |
captured_output += f"\n\nDefined functions: {', '.join(function_names)}\n" | |
captured_output += "Note: Functions need to be explicitly called to see their output." | |
return captured_output | |
except Exception as e: | |
logger.error(f"Execution error: {e}") | |
return f"Error: {e}" | |
finally: | |
# Reset stdout | |
sys.stdout = old_stdout | |
# Return the captured output | |
return redirected_output.getvalue() | |