Python 3 访问字符设备时引发 UnicodeDecodeError
有一天,我在网上找到一个页面,讲的是如何在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')