How to read stdout from subprocess as it is being produced

A

Alex

Hi,

I have a Pyhon GUI application that launches subprocess.
I would like to read the subprocess' stdout as it is being produced
(show it in GUI), without hanging the GUI.

I guess threading will solve the no-hanging issue, but as far as I
searched for now, I've only seen how to read the stdout after
subprocess is finished.

Thanks!
 
A

anthony.tolle

Hi,

I have a Pyhon GUI application that launches subprocess.
I would like to read the subprocess' stdout as it is being produced
(show it in GUI), without hanging the GUI.

I guess threading will solve the no-hanging issue, but as far as I
searched for now, I've only seen how to read the stdout after
subprocess is finished.

Thanks!

If I'm interpreting your needs correctly, then you may find this
module helpful:

http://code.activestate.com/recipes/440554/

I've used it successfully in the past when I wanted to use native
python code (no C extensions necessary) for asynchronous reading from
a child process.

I'm not sure if later versions of Python (2.6, 3.0) support this in
the standard library. I haven't researched it.
 
A

Albert Hopkins

Hi,

I have a Pyhon GUI application that launches subprocess.
I would like to read the subprocess' stdout as it is being produced
(show it in GUI), without hanging the GUI.

I guess threading will solve the no-hanging issue, but as far as I
searched for now, I've only seen how to read the stdout after
subprocess is finished.

I believe that's going to be highly dependent upon the particular, yet
unspecified, GUI toolkit/API.

There are probably a few ways. You're toolkit might native support for
this, but one way would be to use a timer. Here is some pseudocode:

class MyWindow(toolkit.Window):
def __init__(self, ...):
...
self.subprocess = subprocess.Popen(..., stdout=subprocess.PIPE)
self.running = True

...
toolkit.set_timeout(TIMEOUT_VAL, self.read_stdout)

def read_stdout(self, ...):
if not self.running:
return
char = self.subprocess.stdout.read(1)
if char == '':
self.running = False
return
self.update_something(char)
toolkit.set_timeout(TIMEOUT_VAL, self.read_stdout)
 
A

Alex

I believe that's going to be highly dependent upon the particular, yet
unspecified, GUI toolkit/API.

There are probably a few ways. You're toolkit might native support for
this, but one way would be to use a timer.  Here is some pseudocode:

class MyWindow(toolkit.Window):
    def __init__(self, ...):
        ...
        self.subprocess = subprocess.Popen(..., stdout=subprocess.PIPE)
        self.running = True

        ...
        toolkit.set_timeout(TIMEOUT_VAL, self.read_stdout)

    def read_stdout(self, ...):
        if not self.running:
            return
        char = self.subprocess.stdout.read(1)
        if char == '':
            self.running = False
            return
        self.update_something(char)
        toolkit.set_timeout(TIMEOUT_VAL, self.read_stdout)

Hi,

Thanks a lot for the tip!

Alex
 

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,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top