During my testing of Python 2.5b2, I've found something that may be worthy of discussion.  I suspect that recent GC and finalization changes have altered the behavior of the Popen object in subprocess.py.  I am now getting many many many finalization warnings in my code like:
<br><br>Exception exceptions.AttributeError: &quot;'NoneType' object has no attribute 'append'&quot; in &lt;bound method Popen.__del__ of &lt;subprocess.Popen object at 0x2aaaab910950&gt;&gt; ignored<br><br>Is this a bug or a feature?&nbsp; Personally, I'd like to see these messages silenced, since it is being generated during interpreter shutdown.&nbsp; The following patch does the trick for me:
<br><br>--- /usr/local/lib/python2.5/subprocess.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006-07-11 14:11:59.000000000 -0400<br>+++ subprocess.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006-07-12 10:17:09.000000000 -0400<br>@@ -613,7 +613,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # In case the child hasn't been waited on, check if it's done.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.poll(_deadstate=sys.maxint)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.returncode is None:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.returncode is None and _active is not None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Child is still running, keep us alive until we can wait on it.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _active.append(self)<br><br><br>Note that popen.py does something similar, though I am not convinced that the test is right or if it is doing something more subtle:<br><br>&nbsp;&nbsp;&nbsp; def __del__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # In case the child hasn't been waited on, check if it's done.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.poll(_deadstate=sys.maxint)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.sts &lt; 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if _active:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Child is still running, keep us alive until we can wait on it.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _active.append(self)
<br><br>Regards,<br>-Kevin<br><br>