Python регистрация застряла на указанном c байт - 0x90 - PullRequest
1 голос
/ 19 января 2020

Я столкнулся с очень странной проблемой и, честно говоря, понятия не имел, что с этим делать, поэтому решил поспрашивать. Короче говоря, когда я пытаюсь зарегистрировать байт 0x90 в моем logging.Logger, он застревает на всем терминале Python. Из всех байтов, которые я пробовал (все ASCII и множество других тоже), только этот показывает это поведение. Подробнее см. Ниже.

Немного контекста

У меня есть приложение WX, которое получает данные из последовательного порта, отображает их и регистрирует их. Прием данных из порта обрабатывается серверной частью, которую я тщательно протестировал с помощью модульных тестов. Я совершенно уверен, что это работает, когда я использую «изогнутую трубу» для отправки / получения байтов и когда я использую Arduino для отправки байтов в приложение. Фронтенд = приложение WX также, кажется, работает, то есть отображает байты, которые оно получает, и регистрирует их в logging.Logger.

Specifi c проблема

Я попытался повторить все мои единицы бэкэнд-тесты как тест черного ящика всего приложения. Все отлично работает, кроме одного случая, который отправляет несколько байтов, включая 0x90 = 58256 = 'ã'. К моему удивлению, как только этот байт получен, logging.Logger перестает отображать дальнейшие сообщения. Приложение, однако, продолжает работать довольно счастливо.

Вещи, которые я пробовал, и результаты

Этот бедняга , похоже, имел проблему с тем же байтом, но не не получил никаких ответов. У них была похожая проблема здесь , но не упоминали никаких подробностей. В общем, похоже, ничего особенного в 0x90 нет, не так ли?

Я сузил свою проблему до простого средства ведения журнала, см. MWE ниже. Если я просто запускаю MWE из терминала, он завершается без проблем. То же самое, если я запускаю его от Python или от моего Python переводчика в Анаконде. Результат:

.../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.

Решение

Элегантное решение проблемы, которое, как оказывается, заключается в очистке строки от управляющие символы, в это сообщение .

1 Ответ

2 голосов
/ 20 января 2020

Это происходит потому, что консоль python неправильно воспринимает это как специальный управляющий символ для терминала. В частности, он запускает строку управления устройством. И они должны быть прерваны, иначе терминал зависнет. Для проверки попробуйте выполнить print(chr(0x90)) или print(chr(0x90)+chr(0x9C)) в консоли python. Второй ничего не сделает, так как у него есть завершающий байт 0x9c, а первый повесит его.

...