On Jan 27, 11:08 am, Olivier Lefevre <[EMAIL PROTECTED]> wrote: > >> Indeed, if I do this interactively, I can tell after 3 lines that I've > >> gotten all there is to get right now and the fourth readline() call > >> hangs. > > > Can you really? > > Yes interactively: at the command prompt, you can tell when it's over > because you know the command you just sent and whether it requires an > answer and of which kind. Also, even if there is no answer you get a > fresh prompt when the interpreter is done.
Consider pexpect module. It solves the exact problem you have. You can give a r.e. for prompt and it will take care to wait until collecting all output. It basically simulates a human typing to an interpreter. Karthik. > > > Unless there is some way to differentiate between the last line > > and all the other lines of a response, you can't really be sure. > > Yes, that has since occurred to me. I need to echo some magic string > after each command to know that I reached the end of the answer to > the previous command. In interactive mode the prompt fulfills that > role. > > > To check if there is something to read at this very moment, you > > can use any of the following methods: > > Thanks for all the suggestions! That is just what I needed. > > > - select.select() > > - the FIONREAD ioctl (the ioctl() function lives in the fcntl > > module, and the FIONREAD constant is in the termios module) > > - set the underlying file descriptor in non-blocking mode: > > flags = fcntl.fcntl(fd, fcntl.F_GETFL) > > fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NDELAY) > > After that, reads on the pipe will raise an IOError exception > > with the errorcode EWOULDBLOCK. > > That sounds like the simplest approach. > > > - start a thread that does blocking reads from the pipe, and > > puts the chunks it reads on a queue for your main thread to > > grab. > > Yes but my python threading is worse than rudimentary. I will look > into the `trheading` module suggested by the other poster. > > > For the last approach, you might be interested in my asyncproc > > module, which does exactly that. You can download it from > > <http://www.lysator.liu.se/~bellman/download/asyncproc.py>. > > OK, I'll look into that, too. > > Thanks again, > > -- O.L. -- http://mail.python.org/mailman/listinfo/python-list