在Windows中,sys.stdout.write对二进制文件无效

1 投票
1 回答
685 浏览
提问于 2025-04-16 11:49

我有一个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)

这个链接很好地解释了这个问题。

撰写回答