On Fri, Aug 6, 2010 at 12:17 PM, Joshua Russo <josh.r.ru...@gmail.com>wrote:

> On Aug 6, 9:57 am, "J. Cliff Dyer" <j...@sdf.lonestar.org> wrote:
> > "Joshua Russo" <josh.r.ru...@gmail.com> wrote:
> > >On Thu, Aug 5, 2010 at 10:53 PM, Steve Holden <holden...@gmail.com>
> wrote:
> >
> > >> On 8/5/2010 7:16 PM, Joshua Russo wrote:
> > >> > On Aug 4, 6:49 pm, Hassan <hsn.zam...@gmail.com> wrote:
> > >> >>> Ok, so it appears that (in Python 2.5 at least) there is no way to
> > >> capture
> > >> >>> the stdout of subprocess.Popen()
> >
> > >> >> just do this
> >
> > >> >> from subprocess import Popen, PIPE
> > >> >> p = Popen([cmd], stdout=PIPE)
> > >> >> p.stdout.readlines()
> >
> > >> >> thats it!
> >
> > >> > The problem is that it waits for the process to end to output
> > >> > anything. Unless I was doing something wrong, but I think I was
> doing
> > >> > just what you describe here.
> >
> > >> Well, readlines() inherently has to see the end of the data stream
> > >> before it can return a list of all the lines that the data stream
> > >> contains, so that's hardly surprising is it?
> >
> > >> Try using readline() in a loop and see if that gives you better
> results.
> > >> I don't guarantee it will, but at least you will have some chance if
> > >> subprocess.open() *isn't* buffering the whole stream.
> >
> > >> regards
> > >>  Steve
> >
> > >Tried that too and even putting the reading of them in their own thread
> as
> > >someone else suggested on Stackoverflow. I just can't find anyway to
> capture
> > >stdout in real-time from Popen. The problem is that everything uses
> > >readline() that buffers the output.
> >
> > >http://stackoverflow.com/questions/874815/how-do-i-get-real-time-info.
> ..
> > >http://stackoverflow.com/questions/2082850/real-time-subprocess-popen.
> ..
> >
> > >The way I got it to work with out Popen is to use a text box control as
> the
> > >stdout object. This works great, utilizing the object's write() method.
> >
> > >The problem with Popen is that it expects the stdout object to have a
> > >fileno() method also, which the text box control does not have. So I
> tried
> > >extending the text box to add the fileno() and had it return 1 like the
> > >standard stdout, but still no dice. I didn't let the process (unit
> tests)
> > >finish but it definitely was not giving real time output, through it did
> > >accept the control with the fileno() method added. It really seems like
> that
> > >should have worked and I may have been able to dig further into Popen to
> > >make it work but I figured that I had spent too much time on it as it
> was.
> >
> > >If anybody has more suggestions I'd love to hear them.
> >
> > >--
> > >You received this message because you are subscribed to the Google
> Groups "Django users" group.
> > >To post to this group, send email to django-us...@googlegroups.com.
> > >To unsubscribe from this group, send email to
> django-users+unsubscr...@googlegroups.com<django-users%2bunsubscr...@googlegroups.com>
> .
> > >For more options, visit this group athttp://
> groups.google.com/group/django-users?hl=en.
> >
> > If I understand your issue correctly, in ran into something similar a
> while back. The problem is not in subprocess, but in how stdout works.  The
> output is buffered by default, so it only gets written on a line-by-line
> basis.
> >
> > If you want to catch it one character at a time, you have to explicitly
> flush the output after each character using sys.stdout.flush().  Then, of
> course, you'll also have to read it from subprocess one character at a time,
> too,
> > using .read(1) instead of .readline()
> >
> > I hope that addresses your issue.
> >
> > Cheers,
> > Cliff
>
> Thanks for the tip, I'll check it out.


Nope, still no dice. Below is what I did. I modified the worker() function
from one of the Stackoverflow examples. Let me know if I'm using flush
properly. Keep in mind that everything you see here is already running in a
separate thread from the wxPython GUI so I can update the GUI while all my
tests run in the background.

import threading
import subprocess as sp
import sys

class ThreadWorker(threading.Thread):
    def __init__(self, callable, *args, **kwargs):
        super(ThreadWorker, self).__init__()
        self.callable = callable
        self.args = args
        self.kwargs = kwargs
        self.setDaemon(True)

    def run(self):
        try:
            self.callable(*self.args, **self.kwargs)
        except wx.PyDeadObjectError:
            pass
        except Exception, e:
            print e


def worker(pipe):
sys.stdout.write('**start worker**\n')
line = []
while True:
pipe.flush()
blob = pipe.read()
if blob == '':
sys.stdout.write('**break**\n')
break
for c in blob:
line.append(c)
if c == '\n':
sys.stdout.write(''.join(line))
line = []

tstP = sp.Popen("python.exe manage.py test --noinput
--settings=adminTributaria.settings.test", stdout=sp.PIPE, stderr=sp.PIPE)

stdout_worker = ThreadWorker(worker, tstP.stdout)
stdout_worker.start()

tstP.wait()

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to