8

一个名为 == a.py == 的测试文件

import os

if __name__ == '__main__':
    for x in range(0,1000):
        try:
            os.sys.stdout.buffer.write(b"hello\r\n")
            os.sys.stdout.buffer.flush()
        except OSError:
            pass

单独运行时没问题。但是在以下情况下会出现问题:

  1. 运行 python a.py | 更多的
  2. 按 ctrl+c 退出

然后我得到了 Exception OSError: OSError(22, 'Invalid argument') in <_io.TextIOWrapper name='' mode='w' encoding='cp936'> ignored

我已经在 os.sys.stdout.buffer 操作周围捕获了 OSError,但它仍然出错。

如果我不使用 os.sys.stdout.buffer.flush,则没有错误消息。如果我只使用 print(),一切正常。

那么如何正确地将字节写入标准输出呢?

我正在使用 Windows 7 64 位和 Python 3.3.0 32 位。

4

1 回答 1

13

您可以使用os.fdopen不同的模式重新打开标准输出。您可以使用sys.stdout.fileno().

例子:

>>> fp = os.fdopen(sys.stdout.fileno(), 'wb')
>>> fp.write(b'Hello, world')
12
>>> sys.stdout.mode
'w'
>>> fp.mode
'wb'
>>> fp.flush()
Hello, world>>> 
于 2013-05-30T11:33:59.737 回答