read and readline hanging
Karthik Gurusamy
kar1107 at gmail.com
Sun Jan 27 21:41:03 EST 2008
On Jan 27, 11:08 am, Olivier Lefevre <lefev... at yahoo.com> 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.
More information about the Python-list
mailing list