Non-blocking pipes during subprocess handling

Tom Plunket tomas at fancy.org
Mon Jan 8 20:09:57 EST 2007


I'm using subprocess to launch, well, sub-processes, but now I'm
stumbling due to blocking I/O.

Is there a way for me to know that there's data on a pipe, and possibly
how much data is there so I can get it?  Currently I'm doing this:

	process = subprocess.Popen(
		args,
		bufsize=1,
		universal_newlines=True,
		stdout=subprocess.PIPE,
		stderr=subprocess.PIPE)

	def ProcessOutput(instream, outstream):
		text = instream.readline()
		if len(text) > 0:
			print >>outstream, text,
			return True
		else:
			return False
			
	while process.poll() is None:
		ProcessOutput(process.stdout, sys.stdout)
		ProcessOutput(process.stderr, sys.stderr)

	# clean up everything to EOF once the process ends.
	somethingPrinted = True
	while somethingPrinted:
		somethingPrinted = ProcessOutput(
			process.stdout,	sys.stdout)
		somethingPrinted |= ProcessOutput(
			process.stderr, sys.stderr)


Unfortunately, stream.readline will block 'til it gets a line, and
typically there won't be anything on the stderr stream.  The reason for
the redirections in the first place is that I'm launching this script as
a subprocess from a GUI app that catches stdout and stderr and directs
the output to the appropriate windows, but in some cases I don't
actually want the output at all (I've removed that logic though since it
needlessly complicates my example; suffice to say everything below the
process = subprocess.Popen... line is enclosed in a try and then in an
if block.

The documentation on file.read() indicate that there's an option for
"non-blocking" mode, but I'm stumped as to how to even look for how to
enable and use that.

thanks,
-tom!

-- 



More information about the Python-list mailing list