My motivation came from an instance when I was using subprocess.Popen for a Linux / Windows cross platform program. In part of the program, I was writing and reading to a cron like object. On Windows, it was a text file and on Linux it would be the crontab executable. Had I been able to substitute the &quot;open()&quot; function with my wrapper, it would have been the only change I had to make for cross platform compatibility; instead of having to change numerous lines because Linux would need Popen and Windows would need a regular file open(), I could simply make it so that if the platform was Linux, my wrapper is used in place of that. Just another example would be having an external program decrypt a file that can be in plain text or encrypted that might go something like this:<br>

<br>if encryptionEnabled:<br>    fileobj = subprocess.ProcessIOWrapper(&quot;gpg --decrypt supersecret.html.gpg&quot;)<br>else:<br>    fileobj = open(&quot;notsosecret.html&quot;)<br><br>From there, the functions would not have to be modified despite using a running process versus a file object.<br>

<br><div class="gmail_quote">On Tue, Jul 28, 2009 at 01:53, Gregory P. Smith <span dir="ltr">&lt;<a href="mailto:greg@krypto.org" target="_blank">greg@krypto.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


<div>On Mon, Jul 27, 2009 at 5:32 PM, Glyph Lefkowitz&lt;<a href="mailto:glyph@twistedmatrix.com" target="_blank">glyph@twistedmatrix.com</a>&gt; wrote:<br>
&gt; On Mon, Jul 27, 2009 at 3:04 PM, Paul Moore &lt;<a href="mailto:p.f.moore@gmail.com" target="_blank">p.f.moore@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; I like MRAB&#39;s idea of using a (non-standard) &quot;e&quot; flag to include<br>
&gt;&gt; stderr. So &quot;r&quot; reads from stdout, &quot;re&quot; reads from stdout+stderr.<br>
&gt;&gt;<br>
&gt;&gt; Anything more complicated probably should just use &quot;raw&quot; Popen<br>
&gt;&gt; objects. Don&#39;t overcomplicate the interface.<br>
&gt;<br>
&gt; In my opinion, mangling stderr and stdout together is already an<br>
&gt; overcomplication.  It shouldn&#39;t be implemented.<br>
&gt;<br>
&gt; It seems like a good idea, until you realize that subtle changes to your OS,<br>
&gt; environment, or buffering behavior may result in arbitrary, unparseable<br>
&gt; output.<br>
<br>
</div>Agreed.  Leave stderr support out of this.  People who need stderr<br>
should use the full subprocess.Popen interface.  Quick hack unixy<br>
types will just run their process using a shell (which already seems<br>
to be the default based on the &quot;ls -l&quot; example) and add 2&gt;&amp;1.  This<br>
functionality is basically the equivalent of adding the | symbol on<br>
either or both ends of a filename given to open() in perl.  (but<br>
without being so gross).<br>
<br>
I do wonder why you&#39;re trying to make it behave exactly like open()<br>
including the mode= syntax.<br>
<br>
Why not just define several names based on the behavior?<br>
<br>
 ProcessReadWrapper()<br>
 ProcessWriteWrapper()<br>
 ProcessReadWriteWrapper()<br>
<br>
-gps<br>
<div><div></div><div><br>
&gt;<br>
&gt; For example, let&#39;s say you&#39;ve got a program whose output is a list of lines,<br>
&gt; each one containing a number.  Sometimes it tries to import gtk, and fails<br>
&gt; to open its display.<br>
&gt;<br>
&gt; That&#39;s fine, and you can still deal with it, as long as the interleaved<br>
&gt; output looks like this:<br>
&gt;<br>
&gt; 100<br>
&gt; 200<br>
&gt; Gtk-WARNING **: cannot open display:<br>
&gt; 300<br>
&gt; 400<br>
&gt;<br>
&gt; but of course the output might (although unlikely with such small chunks of<br>
&gt; output) end up looking like this, instead:<br>
&gt;<br>
&gt; 100<br>
&gt; 2Gtk-WAR0NING0 **:<br>
&gt; can30not 0open display:<br>
&gt;<br>
&gt; 400<br>
&gt;<br>
&gt; this is the sort of thing which is much more likely to happen once you start<br>
&gt; dealing with large volumes of data, where there are more page-boundaries for<br>
&gt; your buffers to get confused around, and you are playing with buffering<br>
&gt; options to improve performance.  In other words, it&#39;s something that fails<br>
&gt; only at scale or under load, and is therefore extremely difficult to debug.<br>
&gt;<br>
&gt; This option might be okay if it were allowed only on subprocesses opened in<br>
&gt; a text mode, and if the buffering logic involved forced stderr and stdout to<br>
&gt; be line-delimited, and interleave only lines, rather than arbitrary chunks<br>
&gt; of bytes.  Of course then if you use this flag with a program that outputs<br>
&gt; binary data with no newlines it will buffer forever and crash your program<br>
&gt; with a MemoryError, but at least that&#39;s easy to debug when it happens.<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Python-Dev mailing list<br>
&gt; <a href="mailto:Python-Dev@python.org" target="_blank">Python-Dev@python.org</a><br>
&gt; <a href="http://mail.python.org/mailman/listinfo/python-dev" target="_blank">http://mail.python.org/mailman/listinfo/python-dev</a><br>
&gt; Unsubscribe:<br>
&gt; <a href="http://mail.python.org/mailman/options/python-dev/greg%40krypto.org" target="_blank">http://mail.python.org/mailman/options/python-dev/greg%40krypto.org</a><br>
&gt;<br>
&gt;<br>
</blockquote></div><br>