why does popen2 silently ignore IOError?

Donn Cave donn at u.washington.edu
Thu Feb 21 13:57:20 EST 2002

Quoth Graham Guttocks <graham_guttocks at yahoo.co.nz>:
| "Donn Cave" <donn at u.washington.edu> wrote:
| > in the general sense that it does not raise an exception in the case
| > of a non-zero exit from the child process.
| [...]
| > I personally prefer to get an exception, with value from stderr
| > output
| This was what I was looking for.  It sounds like it isn't possible.
| I thought what I wanted was simple.  I'm sending mail by opening a
| pipe to /usr/sbin/sendmail -- if that fails for whatever reason (e.g,
| sendmail program is missing) I want an exception raised with some
| indication of the problem, instead of the current silent failure.
| Is there any way to do this in Python?  Any example code to get me
| started?

It can be done in Python.
- Look at popen2.  Use the Popen3 class directly, and trap stderr.
- Write email to tochild file object.
- Read from the childerr object.  Your program will block until exit.
- Get exit status from the wait() member function.
- For extra credit, process as os.spawnv does to get the integer exit
  status value.
- If status is non-zero, raise exception with data from childerr.

But I didn't write that out as sample code, because there's a big
problem with it as an algorithm:  The read and write steps are in
principle concurrent.  How you solve this is up to you.  Maybe it
isn't even a problem - if you do it in the above order, you may
be delivered a SIGPIPE, or who knows depending on platform, but I'm
pretty sure it wouldn't just block forever.  If there might be input
on the fromchild object, you have another similar problem - if that
fills up because you're looking at childerr, you have a deadlock.

	Donn Cave, donn at u.washington.edu

More information about the Python-list mailing list