在Windows 10上使用日志记录和设置区域设置时Python崩溃



我使用这个答案中的一个配方,以UTF-8记录到文件和控制台,而不是在Windows上进行系统编码(在我的例子中是cp1250(,我的python进程在下面的最后一行崩溃(原文如此!(:

进程已完成,退出代码为1073740940(0xC0000374(

我运行的是Windows 10(版本:10.0.18362.1171(和Python 3.8.6(x64(。

import logging
import locale
log = logging.getLogger(self.dict_letters)
log.setLevel(logging.DEBUG)
console_log = logging.StreamHandler()  # create console handler and set level to debug
console_log.setLevel(LOGGING_LEVEL_CONSOLE)
console_log.setFormatter(logging.Formatter('%(levelname)s - %(message)s'))
log.addHandler(console_log)
file_log = logging.FileHandler('logfile.log'), 'w', 'utf-8')
file_log.setFormatter(logging.Formatter('%(asctime)s | %(levelname)s | %(message)s'))
file_log.setLevel(LOGGING_LEVEL_FILE)
log.addHandler(file_log)
# ensure logging works for Unicode (as per: https://stackoverflow.com/a/22320208/6573902)
if locale.getpreferredencoding().upper() != 'UTF-8':
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

经过多次不同的实验,我意识到在最近更新的Windows 10(2020年8月之后的一次更新(上,设置区域设置可能是危险的,并可能导致Python x64版本的异常(0xc0000374(:3.8.2、3.9、3.8.6、3.7.1(以及可能的其他版本(,系统编码设置为cp1250(以及其他版本(。

即使以前它是良性的,但现在它会导致python进程崩溃。

删除以下行不会在Windows上导致任何输出问题(控制台和日志文件都是UTF-8(:

if locale.getpreferredencoding().upper() != 'UTF-8':
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

最新更新