mirror of
https://github.com/HKUDS/OpenSpace.git
synced 2026-10-09 03:17:51 +00:00
137 lines
No EOL
3.6 KiB
Markdown
137 lines
No EOL
3.6 KiB
Markdown
---
|
|
name: run-shell-python-file-io
|
|
description: Use run_shell with inline Python for reliable file I/O when execute_code_sandbox cannot access working directory files
|
|
---
|
|
|
|
# Run Shell Python File I/O
|
|
|
|
## When to Use This Skill
|
|
|
|
Use this technique when `execute_code_sandbox` cannot access files in your working directory, but you need to perform file operations (read, write, transform) as part of your task execution.
|
|
|
|
## The Pattern
|
|
|
|
Instead of using `execute_code_sandbox`, run Python code directly through `run_shell` with explicit path handling. This provides reliable file I/O capabilities within the task workspace.
|
|
|
|
## How to Apply
|
|
|
|
### Step 1: Identify File Access Needs
|
|
Determine which files you need to read from or write to in the working directory.
|
|
|
|
### Step 2: Write Inline Python via run_shell
|
|
Construct a Python script that handles your file operations and execute it through `run_shell`:
|
|
|
|
```bash
|
|
python3 -c "
|
|
import os
|
|
|
|
# Get the working directory
|
|
work_dir = os.getcwd()
|
|
print(f'Working directory: {work_dir}')
|
|
|
|
# Read a file
|
|
with open('input.txt', 'r') as f:
|
|
content = f.read()
|
|
|
|
# Process the content
|
|
processed = content.upper()
|
|
|
|
# Write to output file
|
|
with open('output.txt', 'w') as f:
|
|
f.write(processed)
|
|
|
|
print('File operation complete')
|
|
"
|
|
```
|
|
|
|
### Step 3: Handle Complex Logic
|
|
For more complex operations, write a temporary Python script file first:
|
|
|
|
```bash
|
|
cat > /tmp/process.py << 'EOF'
|
|
import os
|
|
import json
|
|
|
|
work_dir = os.getcwd()
|
|
|
|
# Read input
|
|
with open('data.json', 'r') as f:
|
|
data = json.load(f)
|
|
|
|
# Transform
|
|
result = {k: v * 2 for k, v in data.items()}
|
|
|
|
# Write output
|
|
with open('result.json', 'w') as f:
|
|
json.dump(result, f, indent=2)
|
|
|
|
print(f'Processed {len(data)} items')
|
|
EOF
|
|
|
|
python3 /tmp/process.py
|
|
```
|
|
|
|
### Step 4: Verify File Operations
|
|
After execution, verify the files were created/modified correctly:
|
|
|
|
```bash
|
|
ls -la
|
|
cat output.txt
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Use Absolute or Relative Paths Explicitly**: Always specify file paths clearly; `os.getcwd()` helps confirm your working directory.
|
|
|
|
2. **Handle Errors Gracefully**: Add try/except blocks to catch file I/O errors:
|
|
```python
|
|
try:
|
|
with open('file.txt', 'r') as f:
|
|
content = f.read()
|
|
except FileNotFoundError:
|
|
print('File not found')
|
|
```
|
|
|
|
3. **Use Here-Docs for Complex Scripts**: For scripts longer than a few lines, use bash here-documents to avoid escaping issues.
|
|
|
|
4. **Clean Up Temporary Files**: If you create temporary scripts, consider removing them after execution.
|
|
|
|
5. **Check Working Directory First**: Print `os.getcwd()` to confirm you're operating in the expected directory.
|
|
|
|
## Common Use Cases
|
|
|
|
- Reading configuration files from the workspace
|
|
- Writing generated reports or outputs
|
|
- Transforming data files (CSV, JSON, XML)
|
|
- Batch processing multiple files
|
|
- Generating structured documents (PDFs, spreadsheets)
|
|
|
|
## Example: Processing Multiple Files
|
|
|
|
```bash
|
|
python3 -c "
|
|
import os
|
|
import glob
|
|
|
|
work_dir = os.getcwd()
|
|
files = glob.glob('*.txt')
|
|
|
|
for f in files:
|
|
with open(f, 'r') as file:
|
|
content = file.read()
|
|
# Process each file
|
|
with open(f'processed_{f}', 'w') as out:
|
|
out.write(content.strip().upper())
|
|
|
|
print(f'Processed {len(files)} files')
|
|
"
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
| Issue | Solution |
|
|
|-------|----------|
|
|
| File not found | Check `os.getcwd()` output; use absolute paths if needed |
|
|
| Permission denied | Ensure the directory is writable; avoid protected system paths |
|
|
| Encoding errors | Specify encoding explicitly: `open('file.txt', 'r', encoding='utf-8')` |
|
|
| Multi-line script issues | Use here-doc (`<< 'EOF'`) instead of `-c` for complex scripts | |