Non-blocking pipe read under Windows NT

Tom NoSpam at
Thu Feb 22 11:52:09 EST 2001

That's a bit tricky.

Windows (at least NT/2K, which fully support named pipes) does support
non-blocking pipes, but I don't think that Python does.  But I don't think
that matters.  I looked into it a while ago (for C++) and decided that it
would be easier to implement an extra thread than to implement non-blocking
pipes for cross-platform purposes.  For one thing, cross-platform threading
libraries are common, whereas non-blocking pipes seem suprisingly uncommon.

So, I don't know what you are trying to do, but if threads are an
alternative soln to your problem (ie. thread + block == non-block), I would
recommend them.

If you still want to persue non-block windows pipes, you could look at the
article "
Named Pipe Type, Read, and Wait Modes" (  The win32
implementation of Python's thread creation (for the popen fn's) is based on
MS knowledgebase article Q190351 (available from  These articles are, unfortunately, in



"Noah" <Noah at> wrote in message
news:q34l6.297$0Q5.207467 at
> Hmmm... Windows Python2.0 does not have fcntl.
> How do I do a non-blocking select on a Pipe file descriptor?
> Under UNIX I can do something like this:
> # hard way to read a file
> import os, fcntl, FCNTL
> # Open a pipe to read a file.
> (fin, fout, ferr) = os.popen3 ('cat testfile')
> # Turn off blocking on file. read() will then return -1 if no data
> flags = fcntl.fcntl (fout.fileno(), FCNTL.F_GETFL, 0)
> flags = flags | FCNTL.O_NONBLOCK
> fcntl.fcntl (fout.fileno(), FCNTL.F_SETFL, flags)
> # Print out the file without blocking.
> done = 0
> while !done:
>     (r,w,e) = ([fout], [], [], None)
>     if len(r) > 0:
>         data = r[0].read()
>         if data == -1:
>             done = 1
>         else:
>             print data

More information about the Python-list mailing list