2007-07-17
Python Cookbook 2.12 在windows平台下向stdout输出二进制数据
需求:
需要输出二进制数据(如,一个图像)到windows平台的标准输出.
讨论:
这里可以使用setmode函数,它位于Python中依赖平台(windows)的msvcrt模块中,用法如下:
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno( ), os.O_BINARY)
现在你就可以调用sys.stdout.write向标准输出输出任意二进制数据.
在类Unix系统中,不会(也不需要)区分二进制文件和文本文件,然而在windows平台上,如果你要输出图像文件, 必须以二进制方式打开.而在Python中,sys.stdout文件对象默认的打开方式是文本模式,所以你需要做如上处理.
你可以让Python以二进制模式打开标准输出,通过给命令行解释器添加'-u'参数.比如,你的CGI脚本运行在Apache服务器下,在你的代码的第一行,可以这样写:
#! c:/python23/python.exe -u
在Python2.3后的安装版本下,上面的方式是可以工作的.问题是,你并不是总是能预计你的脚本会工作在哪个版本的Python下,所以本节开始给出的方法还是推荐使用的.setmode函数通过msvcrt模块让你能修改标准输出的打开模式,在这种情况下,你能保证是以二进制模式打开sys.stdout的.
相关说明:
sys.stdout.fileno(...)
fileno() -> integer "file descriptor".
This is needed for lower-level file interfaces, such os.read().
需要输出二进制数据(如,一个图像)到windows平台的标准输出.
讨论:
这里可以使用setmode函数,它位于Python中依赖平台(windows)的msvcrt模块中,用法如下:
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno( ), os.O_BINARY)
现在你就可以调用sys.stdout.write向标准输出输出任意二进制数据.
在类Unix系统中,不会(也不需要)区分二进制文件和文本文件,然而在windows平台上,如果你要输出图像文件, 必须以二进制方式打开.而在Python中,sys.stdout文件对象默认的打开方式是文本模式,所以你需要做如上处理.
你可以让Python以二进制模式打开标准输出,通过给命令行解释器添加'-u'参数.比如,你的CGI脚本运行在Apache服务器下,在你的代码的第一行,可以这样写:
#! c:/python23/python.exe -u
在Python2.3后的安装版本下,上面的方式是可以工作的.问题是,你并不是总是能预计你的脚本会工作在哪个版本的Python下,所以本节开始给出的方法还是推荐使用的.setmode函数通过msvcrt模块让你能修改标准输出的打开模式,在这种情况下,你能保证是以二进制模式打开sys.stdout的.
相关说明:
sys.stdout.fileno(...)
fileno() -> integer "file descriptor".
This is needed for lower-level file interfaces, such os.read().