mirror of
https://github.com/HKUDS/OpenSpace.git
synced 2026-09-27 01:23:30 +00:00
192 lines
No EOL
4.7 KiB
Markdown
192 lines
No EOL
4.7 KiB
Markdown
---
|
|
name: python-execution-fallback
|
|
description: Four-step recovery workflow for code execution failures when inline Python fails
|
|
---
|
|
|
|
# Python Execution Fallback Workflow
|
|
|
|
This skill provides a systematic debugging approach when inline Python code execution fails, particularly in heredoc or shell_agent contexts.
|
|
|
|
## Pattern Overview
|
|
|
|
When Python code execution fails, follow this recovery workflow:
|
|
|
|
1. **Attempt inline execution first** - Try running Python code directly
|
|
2. **Write script to file on failure** - Persist the code to a `.py` file
|
|
3. **Execute the file** - Run the saved script via shell
|
|
4. **Validate output** - Verify results are correct and complete
|
|
|
|
## When to Use
|
|
|
|
Apply this pattern when:
|
|
- Inline Python execution fails with syntax or runtime errors
|
|
- Heredoc-based code execution encounters parsing issues
|
|
- Working with complex multi-line scripts that need debugging
|
|
- Need systematic approach to isolate execution failures
|
|
- Spreadsheet/data generation tasks fail in inline mode
|
|
|
|
## Step-by-Step Instructions
|
|
|
|
### Step 1: Attempt Inline Execution
|
|
|
|
Try executing Python code inline first (using execute_code_sandbox or similar):
|
|
|
|
```python
|
|
# Example: Attempt inline execution
|
|
import pandas as pd
|
|
import openpyxl
|
|
|
|
df = pd.read_excel("input.xlsx")
|
|
# Process data...
|
|
df.to_excel("output.xlsx", index=False)
|
|
```
|
|
|
|
If this succeeds, proceed. If it fails, move to Step 2.
|
|
|
|
### Step 2: Write Script to File (On Failure)
|
|
|
|
When inline execution fails, write the complete script to a persistent file:
|
|
|
|
```python
|
|
# Capture the script content
|
|
script_content = '''
|
|
import pandas as pd
|
|
import openpyxl
|
|
import sys
|
|
|
|
try:
|
|
# Your original code here
|
|
df = pd.read_excel("input.xlsx")
|
|
|
|
# Processing logic
|
|
result_df = df.groupby("category").sum()
|
|
|
|
# Output
|
|
result_df.to_excel("output.xlsx", index=False)
|
|
print("SUCCESS: File generated")
|
|
|
|
except Exception as e:
|
|
print(f"ERROR: {e}", file=sys.stderr)
|
|
sys.exit(1)
|
|
'''
|
|
|
|
# Write to file
|
|
with open("script.py", "w") as f:
|
|
f.write(script_content)
|
|
|
|
print("Script written to script.py")
|
|
```
|
|
|
|
### Step 3: Execute the File
|
|
|
|
Run the saved script using shell execution:
|
|
|
|
```bash
|
|
python script.py
|
|
```
|
|
|
|
Or with error capture:
|
|
|
|
```bash
|
|
python script.py 2>&1 | tee execution.log
|
|
```
|
|
|
|
This approach:
|
|
- Avoids heredoc parsing issues
|
|
- Provides clearer error messages
|
|
- Allows script inspection and modification
|
|
- Enables re-execution without rewriting
|
|
|
|
### Step 4: Validate Output
|
|
|
|
Verify the results are correct:
|
|
|
|
```python
|
|
# Validation script
|
|
import pandas as pd
|
|
import os
|
|
|
|
# Check file exists
|
|
if os.path.exists("output.xlsx"):
|
|
df = pd.read_excel("output.xlsx")
|
|
print(f"Rows: {len(df)}, Columns: {len(df.columns)}")
|
|
print(df.head())
|
|
print("VALIDATION: PASSED")
|
|
else:
|
|
print("VALIDATION: FAILED - Output file missing")
|
|
```
|
|
|
|
## Code Example: Complete Workflow
|
|
|
|
```python
|
|
# Full fallback workflow example
|
|
def generate_spreadsheet_fallback(data, output_path):
|
|
"""Generate spreadsheet with fallback workflow"""
|
|
|
|
# Step 1: Try inline
|
|
inline_script = f'''
|
|
import pandas as pd
|
|
data = {data}
|
|
df = pd.DataFrame(data)
|
|
df.to_excel("{output_path}", index=False)
|
|
'''
|
|
|
|
try:
|
|
# Attempt inline execution
|
|
result = execute_code_sandbox(code=inline_script)
|
|
if "error" not in result.lower():
|
|
return "SUCCESS_INLINE"
|
|
except Exception as e:
|
|
pass
|
|
|
|
# Step 2: Write to file
|
|
file_script = f'''
|
|
import pandas as pd
|
|
import sys
|
|
|
|
try:
|
|
data = {data}
|
|
df = pd.DataFrame(data)
|
|
df.to_excel("{output_path}", index=False)
|
|
print("SUCCESS")
|
|
except Exception as e:
|
|
print(f"ERROR: {{e}}", file=sys.stderr)
|
|
sys.exit(1)
|
|
'''
|
|
|
|
with open("generate.py", "w") as f:
|
|
f.write(file_script)
|
|
|
|
# Step 3: Execute file
|
|
shell_result = run_shell(command="python generate.py")
|
|
|
|
# Step 4: Validate
|
|
if os.path.exists(output_path):
|
|
return "SUCCESS_FILE"
|
|
else:
|
|
return "FAILED"
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Include error handling** in file-based scripts (try/except with sys.stderr)
|
|
2. **Add success indicators** (print statements) to confirm execution
|
|
3. **Preserve original logic** when converting from inline to file
|
|
4. **Check return codes** when executing scripts via shell
|
|
5. **Clean up temporary files** after successful validation
|
|
6. **Log both stdout and stderr** for debugging
|
|
|
|
## Common Failure Scenarios
|
|
|
|
This pattern helps resolve:
|
|
- Heredoc string escaping issues
|
|
- Multi-line code formatting problems
|
|
- Import path resolution failures
|
|
- Environment variable access issues
|
|
- Complex indentation in inline code
|
|
|
|
## Related Patterns
|
|
|
|
- Combine with `retry-with-modification` for iterative debugging
|
|
- Use alongside `output-validation-check` for result verification
|
|
- Pair with `error-log-analysis` for root cause identification |