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

R

rparimi

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
 
S

skeept

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
 
M

Matt Nordhoff

skeept said:
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...)
--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top