elemes/compiler/python_compiler.py

85 lines
2.6 KiB
Python

"""
Python Compiler/Interpreter implementation for the modular compilation system
"""
import subprocess
import tempfile
import os
from .base_compiler import BaseCompiler
class PythonCompiler(BaseCompiler):
"""
Compiler/Interpreter class for Python programming language
"""
def __init__(self):
super().__init__("Python", ".py")
def compile(self, file_path, timeout=10):
"""
Check Python syntax (simulate compilation)
:param file_path: Path to the Python source file
:param timeout: Compilation timeout in seconds
:return: Dictionary with success, output, and error fields
"""
try:
# Use Python's compile function to check syntax
with open(file_path, 'r', encoding='utf-8') as f:
code = f.read()
# Attempt to compile the code to check for syntax errors
compile(code, file_path, 'exec')
# If we reach this point, syntax is valid
return {
'success': True,
'output': '',
'error': None
}
except SyntaxError as e:
return {
'success': False,
'output': '',
'error': f"SyntaxError: {e.msg} at line {e.lineno}"
}
except Exception as e:
return {
'success': False,
'output': '',
'error': f'Syntax check error: {str(e)}'
}
def run(self, file_path, timeout=5):
"""
Run Python code
:param file_path: Path to the Python source file
:param timeout: Execution timeout in seconds
:return: Dictionary with success, output, and error fields
"""
try:
# Run the Python script
run_result = subprocess.run(
['python3', file_path],
capture_output=True,
text=True,
timeout=timeout
)
return {
'success': True,
'output': run_result.stdout,
'error': run_result.stderr if run_result.stderr else None
}
except subprocess.TimeoutExpired:
return {
'success': False,
'output': '',
'error': 'Program execution timed out'
}
except Exception as e:
return {
'success': False,
'output': '',
'error': f'Runtime error: {str(e)}'
}