FAQ
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

Search Discussions

  • Skeept at Jul 10, 2008 at 9:46 pm

    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
  • Matt Nordhoff at Jul 10, 2008 at 10:31 pm

    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...)
    --

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedJul 9, '08 at 11:32p
activeJul 10, '08 at 10:31p
posts3
users3
websitepython.org

3 users in discussion

Skeept: 1 post Rparimi: 1 post Matt Nordhoff: 1 post

People

Translate

site design / logo © 2022 Grokbase