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.
print(chr(0x90))
juga akan menghancurkan terminal Anda. - person blues   schedule 20.01.2020