I have the following shell script that I would like to write in Python (of course grep .
is actually a much more complex command):
#!/bin/bash
(cat somefile 2>/dev/null || (echo 'somefile not found'; cat logfile)) \
| grep .
I tried this (which lacks an equivalent to cat logfile
anyway):
#!/usr/bin/env python
import StringIO
import subprocess
try:
myfile = open('somefile')
except:
myfile = StringIO.StringIO('somefile not found')
subprocess.call(['grep', '.'], stdin = myfile)
But I get the error AttributeError: StringIO instance has no attribute 'fileno'
.
I know I should use subprocess.communicate()
instead of StringIO to send strings to the grep
process, but I don't know how to mix both strings and files.
Don't use bare
except
, it may catch too much. In Python 3:It works for large files (the file is redirected at the file descriptor level -- no need to load it into the memory).
If you have a file-like object (without a real
.fileno()
); you could write to the pipe directly using.write()
method: