Pencatatan log Python terhenti pada byte tertentu - 0x90

Saya mengalami masalah yang sangat aneh dan sejujurnya saya tidak tahu apa yang harus saya lakukan, maka saya memutuskan untuk bertanya-tanya. Singkat cerita, ketika saya mencoba mencatat satu byte 0x90 di logging.Logger saya, seluruh terminal Python macet. Dari semua byte yang saya coba (semua ASCII dan banyak lainnya juga) ini adalah satu-satunya yang menunjukkan perilaku ini. Lihat di bawah untuk lebih jelasnya.

Sedikit konteks

Saya punya aplikasi WX yang menerima data dari port serial, menampilkannya dan mencatatnya. Penerimaan data dari port ditangani oleh backend, yang telah saya uji secara ekstensif melalui pengujian unit. Saya cukup yakin ini berhasil, baik ketika saya menggunakan "pipa bengkok" untuk mengirim/menerima byte dan ketika saya menggunakan Arduino untuk mengirim byte ke aplikasi. Frontend=aplikasi WX juga tampaknya berfungsi, yaitu menampilkan byte yang diterimanya dan mencatatnya di logging.Logger.

Masalah khusus

Saya mencoba mengulangi semua pengujian backend unit saya sebagai pengujian kotak hitam untuk seluruh aplikasi. Semuanya berfungsi dengan baik kecuali satu kasus, yang mengirimkan beberapa byte, termasuk 0x90 = 58256 = 'ã'. Yang mengejutkan saya, segera setelah byte ini diterima, logging.Logger berhenti menampilkan pesan selanjutnya. Namun, aplikasi ini terus berjalan dengan cukup baik.

Hal yang sudah saya coba dan hasilnya

orang malang sepertinya ada masalah dengan byte yang sama tetapi belum mendapat balasan apa pun. Mereka mengalami masalah serupa di sini tetapi tidak menyebutkan secara spesifik. Secara keseluruhan, sepertinya tidak ada yang istimewa dari 0x90, bukan?

Saya telah mempersempit masalah saya hanya pada fasilitas logging, lihat MWE di bawah. Jika saya menjalankan MWE dari terminal, itu selesai tanpa masalah. Sama jika saya menjalankannya dari juru bahasa Python atau IPython di dalam Anaconda. Hasilnya adalah:

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

Namun, jika saya membuka juru bahasa Python dan kemudian menjalankan MWE baris demi baris, MWE akhirnya macet segera setelah saya mencoba mencatat 0x90. Tampaknya tidak ada cara untuk membuka blokir terminal, bahkan dengan ctrl+C. Saya hanya perlu menghentikan proses penerjemah.

Ada ide apa yang terjadi? Terima kasih banyak telah melihat ini.

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.

Larutan

Solusi elegan untuk masalah ini, yang ternyata tentang membersihkan string dari karakter kontrol, ada di postingan ini.


person Aleksander Lidtke    schedule 19.01.2020    source sumber
comment
Perhatikan bahwa ini tidak ada hubungannya dengan logging. Coba mulai sesi python interaktif dan print(chr(0x90)) juga akan menghancurkan terminal Anda.   -  person blues    schedule 20.01.2020


Jawaban (1)


Hal ini terjadi karena konsol python salah melihat ini sebagai karakter kontrol khusus untuk terminal. Khususnya, ini memulai string kontrol perangkat. Dan itu harus dihentikan atau terminal akan menggantung. Untuk memverifikasi coba jalankan print(chr(0x90)) atau print(chr(0x90)+chr(0x9C)) di konsol python. Yang kedua tidak akan melakukan apa pun karena memiliki 0x9c byte terminasi sedangkan yang pertama akan menggantungnya.

person blues    schedule 20.01.2020
comment
Terima kasih banyak @blues! Tidak pernah memikirkan hal ini. Untuk membuat aplikasi saya aman dari kegagalan, menurut Anda apakah saya harus mengawasi semua string kontrol tersebut dan memastikan saya memperlakukannya secara terpisah? Apakah ada daftar string kontrol bawaan Python? - person Aleksander Lidtke; 20.01.2020