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.