我正在编写驱动程序,并根据一些条件连接一些十六进制指令。到目前为止,所有说明都按预期工作。
我正在处理的新指令没有按预期工作,所以我试图在连接之后和执行之前打印出指令以查看错误。
msg = '\xc2%s%s' % ('\x1b\x63', '07')
assert self.dev.ctrl_transfer(0x21, 9, 0x0300, 0, msg) == len(msg)
print(msg)
当我在连接后打印它时,它会清除控制台并打印'07',然后继续执行其余的驱动程序。我能够打印并执行我连接的所有其他指令,例如以下内容,没有问题。
msg = '\xc2%s%s' % ('\x1b\x72, '07')
有谁知道为什么会这样? '\ x63'字节是否告诉python做一些我不知道的事情?它应该与指令的其余部分连接,然后是'\ x07'字节。请注意,如果我在'07'之前加入'\ x'(与我上面的代码不同),它仍然会做同样的事情,它只是不打印'07',它留下一个空行。
谢谢!
答案 0 :(得分:1)
角色'\x63'
与'c'
的角色相同(以及其他六种拼写方式)。字母c
并不代表Python的任何特殊内容。
'\x1b'
之前的角色c
是Escape。这对Python来说并不意味着什么特别 - 但它可能对你的终端有所帮助。大多数终端使用"转义序列"从Escape开始并以字母结束,例如向上滚动,更改主文本颜色或清除屏幕。
如果这妨碍了交互式调试会话,您可能需要考虑打印字符串的repr
而不是字符串本身。最简单的方法是不使用print
:
>>> msg = b'\x1b\x63'
>>> msg
b'\x1bc'
>>> print(repr(msg))
b'\x1bc'
请注意,无论哪种方式,它都包含b
和引号 - 并且它以十六进制方式转义所有不可打印的字节。它与Unicode字符串基本相同,而不是字节字符串:
>>> msg = '\x1b\x63'
>>> msg
'\x1bc'
>>> print(repr(msg))
'\x1bc'
如果你正在使用Python 2.x,那么你在Unicode上会有u
个前缀而不是前缀,并且在字节上没有前缀而不是b
,但是基本相同。