redirecting output of process to a file using subprocess.Popen()

skeept skeept at gmail.com
Thu Jul 10 17:46:50 EDT 2008


On Jul 9, 7:32 pm, rpar... at gmail.com wrote:
> I am trying to redirect stderr of a process to a temporary file and
> then read back the contents of the file, all in the same python
> script. As a simple exercise, I launched /bin/ls but this doesn't
> work:
>
> #!/usr/bin/python
> import subprocess as proc
> import tempfile
> name = tempfile.NamedTemporaryFile(mode='w+b')
> print 'name is '+ name.name
>
> cmd = []
> cmd.append('/bin/ls')
> cmd.append('-l')
> cmd.append('/tmp')
> p = proc.Popen(cmd, stdout=name, stderr=proc.STDOUT, close_fds=True)
> while True:
>    ret = p.poll()
>    if (ret is not None):
>       output = name.readlines()
>       print 'out = ', output
>       break
>
> $python sub.py
> name is /tmp/tmpjz4NJY
> out =  []
>
> I tried calling flush() on the file object but this didn't help
> either. Tried closing and re-opening the file, but closing the file
> object results in it getting deleted. Can the above be made to work by
> using tempfiles?
>
> thanks


your script works just fine.
The problem is that you have to move to the beggining of the file to
read the actual contents of
the file.
name.seek(0)

The whole program would be:

#!/usr/bin/python
import subprocess as proc
import tempfile
name = tempfile.NamedTemporaryFile(mode='w+b')
print 'name is '+ name.name

cmd = []
cmd.append('/bin/ls')
cmd.append('-l')
cmd.append('/tmp')
p = proc.Popen(cmd, stdout=name, stderr=proc.STDOUT, close_fds=True)
while True:
   ret = p.poll()
   if (ret is not None):
      name.seek(0)
      output = name.readlines()
      print 'out = ', output
      break



More information about the Python-list mailing list