[Python-Dev] Web servers, bytes, str, documentation, Python 3.2a4

Glenn Linderman v+python at g.nevcal.com
Sat Nov 20 07:56:18 CET 2010


On 11/19/2010 7:48 PM, Glenn Linderman wrote:
> One of the cgitb outputs from my attempt to serve the binary file 
> claims that my CGI script's output file (which comes from a subprocess 
> PIPE) is a TextIOWrapper with encoding cp1252.  Maybe that is the 
> default that comes when a new Python is launched, even though it gets 
> a subprocess PIPE as stdout?

So the rather gross code below solves the cp1252 stdout problem, and 
also permits both strings and bytes to be written to the same file, 
although those two features are separable.  But now that I've worked 
around it, it seems that subprocesss should somehow ensure that launched 
Python programs know they are working on a binary stream?  Of course, 
not all programs launched are Python programs... so maybe it should be a 
documentation issue, but it seems to be missing from the documentation.

#####################################
if sys.version_info[ 0 ] == 2:
     class IOMix():
         def __init__( self, fh, encoding="UTF-8"):
             self.fh = fh
         def write( self, param ):
             if isinstance( param, unicode ):
                 self.fh.write( param.encode( encoding ))
             else:
                 self.fh.write( param )
#####################################
if sys.version_info[ 0 ] == 3:
     class IOMix():
         def __init__( self, fh, encoding="UTF-8"):
             if hasattr( fh, 'buffer'):
                 self.bio = fh.buffer
                 fh.flush()
                 self.last = 'b'
                 import io
                 self.txt = io.TextIOWrapper( self.bio, encoding, None, 
'\r\n')
             else:
                 raise ValueError("not a buffered stream")
         def write( self, param ):
             if isinstance( param, str ):
                 self.last = 't'
                 self.txt.write( param )
             else:
                 if self.last == 't':
                     self.txt.flush()
                 self.last = 'b'
                 self.bio.write( param )
#####################################


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20101119/3470e20e/attachment-0001.html>


More information about the Python-Dev mailing list