Python日志记录卡在特定字节0x90上

2024-04-25 12:11:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个非常奇怪的问题,老实说,我不知道该怎么办,因此决定四处打听。长话短说,当我试图在我的logging.Logger中记录一个字节0x90时,整个Python终端都卡住了。在我尝试过的所有字节中(所有ASCII和其他很多字节),这是唯一一个显示这种行为的字节。有关更多详细信息,请参见下文

一点背景

我有一个WX应用程序,它从串口接收数据,显示数据并记录数据。从端口接收数据由后端处理,我已经通过单元测试对后端进行了广泛测试。我很确定,无论是在我使用弯管发送/接收字节时,还是在我使用Arduino将字节发送到应用程序时,它都是有效的。前端=WX应用程序似乎也能工作,即显示它接收的字节并将它们记录在logging.Logger

具体问题

我试图重复我所有的单元后端测试,作为整个应用程序的黑盒测试。除了一个发送几个字节的情况外,其他情况都可以正常工作,包括0x90 = 58256 = 'ã'。令我惊讶的是,一旦收到这个字节,logging.Logger就停止显示任何进一步的消息。然而,该应用程序仍在非常愉快地继续运行

我尝试过的事情和结果

这个poor guy似乎在同一字节上有问题,但没有得到任何回复。他们也有类似的问题,但没有提到任何细节。总而言之,0x90似乎没有什么特别之处,是吗

我已经把我的问题缩小到了测井设备,请参见下面的MWE。如果我只是从终端运行MWE,那么它会顺利完成。如果我在Anaconda中从Python或IPython解释器运行它也是一样的。结果是:

.../tests$ python3 ./mwe.py 
0.5.1.2
(3, 5, 4)
2020-01-19 20:15:49,184 - MyLog - INFO - j
2020-01-19 20:15:49,184 - MyLog - INFO - 

但是,如果我打开一个Python解释器,然后逐行执行MWE,它最终会在我尝试记录0x90时卡住。似乎没有办法解锁终端,即使使用ctrl+C也不行。我只需要终止解释器进程

知道发生了什么事吗?非常感谢你看这个

MWE

import logging, sys
print(logging.__version__)
# 0.5.1.2
print(sys.version_info[:3])
# (3, 5, 4)
logger = logging.getLogger("MyLog")
handler = logging.StreamHandler()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
handler.setLevel(logging.INFO)
logger.addHandler(handler)
logger.info(chr(0x6a))
# 2020-01-18 20:39:00,696 - MyLog - INFO - j
logger.info(chr(0x90))
# 2020-01-18 20:39:07,617 - MyLog - INFO -
# Python console is stalled from now-on.

解决方案

这个问题的一个优雅的解决方案是this post,它是关于从控制字符中清除字符串的


Tags: info应用程序终端字节logging记录logger解释器
1条回答
网友
1楼 · 发布于 2024-04-25 12:11:02

这是因为python控制台不正确地将其视为终端的特殊控制字符。具体地说,它启动一个device control string.,需要终止的部分将被终止,否则终端将挂起。要验证,请尝试在python控制台中执行print(chr(0x90))print(chr(0x90)+chr(0x9C))。第二个将不执行任何操作,因为它有终止的0x9c字节,而第一个将挂起它

相关问题 更多 >

    热门问题