Recipe 2.12. Sending Binary Data to Standard Output Under Windows
Credit: Hamish Lawson
Problem
You want to send binary data (e.g., an
image) to stdout under Windows.
Solution
That's what the setmode function,
in the platform-dependent (Windows-only) msvcrt
module in the Python Standard Library, is for:
import sysYou can now
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno( ), os.O_BINARY)
call sys.stdout.write with any bytestring as the
argument, and the bytestring will go unmodified to standard output.
Discussion
While Unix doesn't make (or need) a distinction
between text and binary modes, if you are reading or writing binary
data, such as an image, under Windows, the file must be opened in
binary mode. This is a problem for programs that write binary data to
standard output (as a CGI script, for example, could be expected to
do), because Python opens the sys.stdout file
object on your behalf, normally in text mode.You can have stdout opened in binary mode instead
by supplying the -u command-line option to the
Python interpreter. For example, if you know your CGI script will be
running under the Apache web server, as the first line of your
script, you can use something like:
#! c:/python23/python.exe -uassuming you're running under Python 2.3 with a
standard installation. Unfortunately, you may not always be able to
control the command line under which your script will be started. The
approach taken in this recipe's
"Solution" offers a workable
alternative. The setmode function provided by the
Windows-specific msvcrt module lets you change the
mode of stdout's underlying file
descriptor. By using this function, you can ensure from within your
program that sys.stdout gets set to binary mode.
See Also
Documentation for the msvcrt module in the
Library Reference and Python in a
Nutshell.