By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,361 Members | 2,108 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,361 IT Pros & Developers. It's quick & easy.

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

P: n/a
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
Jul 9 '08 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On Jul 9, 7:32*pm, rpar...@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
Jul 10 '08 #2

P: n/a
skeept wrote:
On Jul 9, 7:32 pm, rpar...@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...)
--
Jul 10 '08 #3

This discussion thread is closed

Replies have been disabled for this discussion.