"""Python execution command handler.""" import asyncio import logging from pathlib import Path from typing import Any from browser_use.skill_cli.sessions import SessionInfo logger = logging.getLogger(__name__) async def handle(session: SessionInfo, params: dict[str, Any]) -> Any: """Handle python command. Supports: - python "" - Execute Python code - python --file script.py - Execute Python file - python --reset - Reset namespace - python --vars - Show defined variables """ python_session = session.python_session browser_session = session.browser_session # Handle --reset if params.get('reset'): python_session.reset() return {'reset': True, 'message': 'Python namespace cleared'} # Handle --vars if params.get('vars'): variables = python_session.get_variables() return {'variables': variables, 'count': len(variables)} # Get code to execute code = params.get('code') # Handle --file if params.get('file'): file_path = Path(params['file']) if not file_path.exists(): return {'success': False, 'error': f'File not found: {file_path}'} if file_path.is_dir(): return {'success': False, 'error': f'Path is a directory, not a file: {file_path}'} code = file_path.read_text() if not code: return {'success': False, 'error': 'No code provided. Use: python "" or --file script.py'} # Execute code in a thread pool so browser operations can schedule back to the event loop loop = asyncio.get_running_loop() result = await loop.run_in_executor(None, python_session.execute, code, browser_session, loop, session.actions) if result.success: # Return raw text output for clean display return {'_raw_text': result.output} if result.output else {} else: return {'error': result.error or 'Unknown error'}