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

Matt Nordhoff mnordhoff at mattnordhoff.com
Fri Jul 11 00:31:02 CEST 2008


skeept wrote:
> 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

This is an aside, but why the loop?

...
p = ...
p.wait()
name.seek(0)
...

(p.wait() returns p.returncode, just like p.poll() does, but you aren't
using it anyway...)
-- 



More information about the Python-list mailing list