mirror of
https://github.com/HKUDS/OpenSpace.git
synced 2026-09-28 01:33:20 +00:00
100 lines
No EOL
2.9 KiB
Markdown
100 lines
No EOL
2.9 KiB
Markdown
---
|
|
name: python-shell-fallback
|
|
description: Fallback to shell execution when sandbox fails for library-dependent Python code
|
|
---
|
|
|
|
# Python Shell Fallback
|
|
|
|
When `execute_code_sandbox` fails for Python code that depends on external libraries, use `run_shell` with a heredoc Python script as a reliable fallback. The shell environment typically has better access to installed packages and system configuration than the sandbox.
|
|
|
|
## When to Use This Pattern
|
|
|
|
Apply this skill when:
|
|
- `execute_code_sandbox` returns errors related to missing libraries (e.g., `ModuleNotFoundError`)
|
|
- The code requires packages that may not be installed in the sandbox environment
|
|
- You need PDF generation, data visualization, or other library-heavy operations
|
|
- Previous sandbox execution attempts have failed with import errors
|
|
|
|
## How to Implement
|
|
|
|
### Step 1: Identify the Failure
|
|
|
|
Check if the sandbox error indicates a library/dependency issue:
|
|
- `ModuleNotFoundError: No module named 'xxx'`
|
|
- `ImportError: cannot import name 'xxx'`
|
|
- Similar package-related errors
|
|
|
|
### Step 2: Convert to Shell Execution
|
|
|
|
Rewrite the code execution using `run_shell` with a heredoc:
|
|
|
|
```bash
|
|
python3 << 'EOF'
|
|
# Your Python code here
|
|
import library_name
|
|
# ... rest of code
|
|
EOF
|
|
```
|
|
|
|
### Step 3: Execute via run_shell
|
|
|
|
Call `run_shell` with the heredoc Python script:
|
|
|
|
```
|
|
command: python3 << 'EOF'
|
|
import reportlab
|
|
from reportlab.lib.pagesizes import letter
|
|
from reportlab.pdfgen import canvas
|
|
|
|
# Your library-dependent code here
|
|
c = canvas.Canvas("output.pdf", pagesize=letter)
|
|
c.drawString(100, 750, "Hello World")
|
|
c.save()
|
|
EOF
|
|
```
|
|
|
|
## Example: PDF Generation Fallback
|
|
|
|
**Sandbox attempt (fails):**
|
|
```python
|
|
# execute_code_sandbox call fails with:
|
|
# ModuleNotFoundError: No module named 'reportlab'
|
|
```
|
|
|
|
**Shell fallback (works):**
|
|
```bash
|
|
python3 << 'EOF'
|
|
from reportlab.lib.pagesizes import letter
|
|
from reportlab.pdfgen import canvas
|
|
|
|
c = canvas.Canvas("legal_memo.pdf", pagesize=letter)
|
|
c.setTitle("Legal Memorandum")
|
|
c.drawString(100, 750, "CONFIDENTIAL LEGAL MEMORANDUM")
|
|
c.save()
|
|
print("PDF created successfully")
|
|
EOF
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Use quoted heredoc (`<< 'EOF'`)** - Prevents variable expansion, keeping Python code intact
|
|
2. **Verify output** - Check stdout/stderr from `run_shell` to confirm success
|
|
3. **Handle file paths** - Ensure output files are written to accessible directories
|
|
4. **Test incrementally** - For complex scripts, test in smaller chunks first
|
|
5. **Include error handling** - Add try/except blocks to capture issues gracefully
|
|
|
|
## Alternative: Inline Python Command
|
|
|
|
For simple one-liners or short scripts:
|
|
|
|
```bash
|
|
python3 -c "import reportlab; print(reportlab.__version__)"
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
If shell execution also fails:
|
|
- Check if Python3 is available: `which python3`
|
|
- Verify package installation: `pip3 list | grep package_name`
|
|
- Try `python` instead of `python3` (some systems differ)
|
|
- Consider installing the package: `pip3 install package_name` |