任务
在 Windows平台上,你想把二进制数据(比如一张图片)发送到stdout 中。
解决方案
Python 标准库中,依赖特定平台(Windows)的模块 msvcrt 提供了 setmode 函数,可用来完成这个任务:
import sys
if sys,platform =="win32":
import os,msvcrt
msvcrt,setmode(sys.stdout.fileno(),os .O_BINARY)
现在可以给 sys.stdout.write 任何字节或者字符串参数,这些字节和字符串会被不加修改地传递到标准输出中。
讨论
由于 UNIX 并不(或不需要)区分文本和二进制模式,如果打算在 Windows 中读取或者写人二进制数据,比如图片,则必须以二进制模式打开文件。这对于向标准输出(比如,CGI脚本就可能会这么干)写人二进制数据的程序而言是个问题,因为Python通常以文本模式打开 sys.stdout 文件对象。
可以指定命令行选项-u 以二进制模式打开 stdout。比如,如果你知道你的 CGI 脚本运行在 Apache web 服务器中,可以这样写你的脚本的第一行:
#!c:/python23/python.exe -u
这假设了用的是 Python2.3 的标准安装。不过,并不总能控制你的脚本在什么样的命令行中运行。解决方案中给出的是一个可行的选择。setmode函数提供了Windows专用的 msvcrt 模块,以方便用户修改 stdout 固有的文件描述符。通过这个函数,可以在程序内部确认 sys.stdout 被设置为二进制模式,