| 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. |
| """ |
| |
| old_stdout = sys.stdout |
| redirected_output = sys.stdout = io.StringIO() |
|
|
| |
| exec_globals = {} |
|
|
| try: |
| |
| tree = ast.parse(code) |
| function_names = [ |
| node.name for node in ast.walk(tree) if isinstance(node, ast.FunctionDef) |
| ] |
|
|
| |
| exec(code, exec_globals) |
|
|
| |
| 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: |
| |
| sys.stdout = old_stdout |
|
|
| |
| return redirected_output.getvalue() |
|
|