Multiple process output

P

Paulo J. Matos

Hi all,

I am have a function which executes a command in the shell. The stdout
and stderr of the command should be multipled to two strings for stdout
and stderr respectively and stdout and stderr of the current process
respectively.

I have done like this:
from subprocess import Popen, PIPE, STDOUT
from select import select
from os import read
from sys import stdout, stderr

def communicate(p):
"""


Multiplex the subprocess stdout/stderr to the process stdout/stderr


and a tuple of strings


"""
output = []
errput = []

while True:
(ready_to_read, _, _) = select([p.stdout, p.stderr], [], [])
dataout = ""
dataerr = ""

if p.stdout in ready_to_read:
dataout = read(p.stdout.fileno(), 1024)
stdout.write(dataout)
output.append(dataout)

if p.stderr in ready_to_read:
dataerr = read(p.stderr.fileno(), 1024)
stderr.write(dataerr)
errput.append(dataerr)

if dataout == "" and dataerr == "":
p.stdout.close()
p.stderr.close()
break

return (''.join(output), ''.join(errput))

def exe(s, cwd=None, output_command=True):
if output_command:
print s
p = Popen(s, stdin=None, stdout=PIPE, stderr=PIPE, shell=True, cwd=cwd)
(output, err) = communicate(p)
rc = p.wait()
return (rc, output, err)


Unfortunately, the program is _sometimes_ but not always getting stuck
on the call to select. I don't really understand when this happens. Any
suggestions to the above code so select doesn't block the function?

Cheers,
 

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

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top