为什么sys.stdin.read(4).encode('utf-8')返回超过4个字节?

时间:2015-11-20 21:10:05

标签: python

我通过Chrome / JavaScript sendNativeMessage函数将Chrome中的JSON对象传递给我的Python应用程序stdin。

有时,以下代码有效。其他时候(我相信较大的消息),它不起作用。我不确定我做错了什么,但我会说有时sys.stdin.read(4).encode('utf-8')似乎读取7个字节而不是指定的4个字节,那就是它打破了“struct.error:unpack需要一个长度为4的字节对象”消息。

有人能让我知道我在这里做错了吗?

# On Windows, the default I/O mode is O_TEXT. Set this to O_BINARY
# to avoid unwanted modifications of the input/output streams.
import os, msvcrt
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

# Read the message length (first 4 bytes).
#for line in sys.stdin:
text_length_bytes = sys.stdin.read(4).encode('utf-8')

logging.info( text_length_bytes )

# Unpack message length as 4 byte integer.
text_length = struct.unpack('i', text_length_bytes)[0]

logging.info( text_length )

# Read the text of the message.
text = json.loads( sys.stdin.read(text_length) )

1 个答案:

答案 0 :(得分:1)

一个Unicode字符可能包含多个字节:

In [4]: len('ü'.encode('utf-8'))
Out[4]: 2

由于您希望将这4个字节解码为整数,您可能希望首先从stdin读取它们作为字节(而不是str):

In [8]: type(sys.stdin.read(4))
aoeu
Out[8]: str

In [9]: type(sys.stdin.buffer.read(4))
aoeu
Out[9]: bytes