在Windows中,sys.stdout.write对二进制文件无效
我有一个Python脚本,它负责处理所有进来的请求,并根据输入的类型生成和返回内容。
当我用下面的命令运行我的Python脚本时:
print "Content-Type: text/plain\r\n\r\n" #debug mode
生成的HTML正是我期待的样子。但是,当我把上面的那行注释掉时,输出的一部分就被截断了。我是通过读取一个文件来生成HTML,并使用 sys.stdout.write
将内容写到输出中。
代码链接:
驱动程序: http://pastebin.com/VULgJWEx (里面有打印语句)
处理程序: http://pastebin.com/j87rrQyx (里面有写入标准输出的函数writeFileToStdout)
示例:
内容类型:文本 -
Content-Length: 105
Content-Type: application/vnd.apple.mpegurl
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:118394
#EXTINF:5,
20110203T230818-01-118403.ts
没有打印的时候:
Content-Length: 105
Content-Type: application/vnd.apple.mpegurl
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:118394
#EXTINF:5,
20110203T230818-01-118403 #(ts is missing!!)
最后的ts被截断了。
有没有人知道为什么打印会导致这个问题?(还是说是其他原因?)
1 个回答
3
在打印或标准输出(stdout)方面并没有问题(这也是预期的结果)。
我当时试图从一个二进制文件(在Windows系统上)读取数据,并把它写入标准输出。因为'sys'模块会代你打开'stdout'这个文件对象,而通常它是以文本模式打开的,所以事情就变得有点混乱了。
为了修复这个问题:
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
这个链接很好地解释了这个问题。