Python 3 访问字符设备时引发 UnicodeDecodeError

1 投票
2 回答
1184 浏览
提问于 2025-04-17 08:33

有一天,我在网上找到一个页面,讲的是如何在Linux上处理游戏手柄的输入。代码如下:

import sys
pipe = open('/dev/input/js0','r')
while 1:
    for character in pipe.read(1):
        sys.stdout.write(repr(character))
        sys.stdout.flush()

这个程序是用来打开一个连接在USB端口上的Logitech Dual Action游戏手柄的设备文件。当我在Python 2.7下运行这个程序时,得到了预期的输出:

'\x0c''\xe0''E''\x00''\x01''\x00''\x01''\x01''D''\xe0''E''\x00''\x00''\x00'
'\x01''\x01''\xbc''^''F''\x00''\x01''\x00''\x01''\x05''<''_''F''\x00''\x00'
'\x00''\x01''\x05'

按下按钮时会生成一些字节,这些字节会被输出到标准输出中。然而,当我用Python 3.2运行同样的脚本时,得到的结果却是:

Traceback (most recent call last):
  File "js.py", line 6, in <module>
    for character in pipe.read(1):
  File "/usr/lib/python3.2/codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8d in position 1: invalid start byte

字节的位置会有所不同,包括字节的具体位置以及它是起始字节还是结束字节,除此之外,我几乎只得到了这些。我想知道是什么导致了这个错误,以及该如何修复它。现在,我明白Python 2是个很棒的语言,而Python 3是在它的基础上发展的,但我开始学习并且正在继续学习Python 3,我现在只想坚持用这个版本。我正在运行Ubuntu GNU/Linux 11.10,安装了Python 2.7和3.2。

2 个回答

2

你不会从游戏手柄接收到字符,而是接收到字节。所以,你需要读取字节,而不是字符。并不是所有的字节序列都能转换成有效的字符,这就是你收到错误的原因。

想了解如何以二进制模式打开和读取文件,可以查看Python的文档中关于open方法的说明,链接在这里:http://docs.python.org/library/functions.html#open

2

如果你想获取原始的字节数据,那么你需要以二进制模式打开它。

pipe = open('/dev/input/js0','rb')

撰写回答