OpenSpace/benchmarks/gdpval/skills/python-debug-execution-911f17/SKILL.md
2026-07-17 11:43:42 +08:00

129 lines
No EOL
3.5 KiB
Markdown

---
name: python-debug-execution-911f17
description: Debug Python script execution failures by capturing full tracebacks and verifying working directory
---
# Python Debug Execution
This skill provides a pattern for debugging Python script execution failures. It ensures you capture actual tracebacks instead of opaque errors and verifies the working directory before file operations.
## Core Pattern
### 1. Execute with Full Traceback Capture
Always run Python scripts with stderr redirected and exit code reported:
```bash
python3 script.py 2>&1 ; echo Exit code: $?
```
This pattern:
- `2>&1` - Redirects stderr to stdout so all output (including tracebacks) is captured together
- `echo Exit code: $?` - Reports the exit code to distinguish between successful runs and failures
**Why this matters:** Opaque errors without tracebacks make it impossible to identify the root cause. The exit code tells you if the script succeeded (0) or failed (non-zero).
### 2. Verify Working Directory Before File Operations
Before any file read/write operations in your Python script, add:
```python
import os
print(f"Current working directory: {os.getcwd()}")
```
Or for debugging, add at the start of your script:
```python
import os
import sys
# Debug: show execution context
print(f"Script path: {__file__}")
print(f"Working directory: {os.getcwd()}")
print(f"Python version: {sys.version}")
```
**Why this matters:** File operations often fail due to incorrect assumptions about the current working directory. Verifying `os.getcwd()` helps diagnose path-related errors.
## Usage Examples
### Example 1: Running a Script with Debug Output
```bash
# Instead of:
python3 analyze.py
# Use:
python3 analyze.py 2>&1 ; echo Exit code: $?
```
### Example 2: Script with Directory Verification
```python
#!/usr/bin/env python3
import os
import pandas as pd
# Verify execution context
print(f"Working directory: {os.getcwd()}")
# Now safe to do file operations
data_path = "data/input.csv"
print(f"Attempting to read: {data_path}")
# Check if file exists before reading
if os.path.exists(data_path):
df = pd.read_csv(data_path)
print(f"Successfully loaded {len(df)} rows")
else:
print(f"ERROR: File not found at {os.path.abspath(data_path)}")
print(f"Directory contents: {os.listdir('.')}")
```
### Example 3: Debug-First Script Template
```python
#!/usr/bin/env python3
"""Template for debuggable Python scripts."""
import os
import sys
import traceback
def main():
# Debug: execution context
print("=" * 50)
print(f"Script: {__file__}")
print(f"Working directory: {os.getcwd()}")
print(f"Python: {sys.version}")
print("=" * 50)
try:
# Your main logic here
pass
except Exception as e:
print(f"ERROR: {type(e).__name__}: {e}")
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()
```
## Troubleshooting Checklist
When a Python script fails:
1. **Check the exit code** - Non-zero means failure
2. **Read the full traceback** - Look for the actual error message and line number
3. **Verify working directory** - Use `os.getcwd()` to confirm file paths are correct
4. **Check file existence** - Use `os.path.exists()` before operations
5. **Use absolute paths** - Consider `os.path.abspath()` for clarity
## When to Apply This Pattern
- Running any Python script from the command line
- Debugging script execution failures in automated agents
- Writing scripts that perform file I/O operations
- Creating reproducible execution environments