python3.13.0 导入 nb_log 包运行报错“AttributeError: module ‘logging’ has no attribute ‘_acquireLock’”,怎么办?
注:我用到的 nb_log 为 12.9。【20241113】
解决方法:
直接修改 nb_log 的源码,将报错的文件 log_manager.py
中的代码改掉:
def revision_add_handler(self, hdlr): # 从添加源头阻止同一个logger添加同类型的handler。
"""
Add the specified handler to this logger.
"""
# logging._acquireLock() # noqa
#
# try:
# """ 官方的
# if not (hdlr in self.handlers):
# self.handlers.append(hdlr)
# """
# hdlrx_type_set = set()
# for hdlrx in self.handlers:
# hdlrx_type = _get_hanlder_type(hdlrx)
# # if hdlrx_type == logging.StreamHandler: # REMIND 因为很多handler都是继承自StreamHandler,包括filehandler,直接判断会逻辑出错。
# # hdlrx_type = ColorHandler
# hdlrx_type_set.add(hdlrx_type)
#
# hdlr_type = _get_hanlder_type(hdlr)
# # if hdlr_type == logging.StreamHandler:
# # hdlr_type = ColorHandler
# if hdlr_type not in hdlrx_type_set:
# self.handlers.append(hdlr)
# finally:
# logging._releaseLock() # noqa
with logging._lock: # 参考python3.13.0的logging模块中的config.py
""" 官方的
if not (hdlr in self.handlers):
self.handlers.append(hdlr)
"""
hdlrx_type_set = set()
for hdlrx in self.handlers:
hdlrx_type = _get_hanlder_type(hdlrx)
# if hdlrx_type == logging.StreamHandler: # REMIND 因为很多handler都是继承自StreamHandler,包括filehandler,直接判断会逻辑出错。
# hdlrx_type = ColorHandler
hdlrx_type_set.add(hdlrx_type)
hdlr_type = _get_hanlder_type(hdlr)
# if hdlr_type == logging.StreamHandler:
# hdlr_type = ColorHandler
if hdlr_type not in hdlrx_type_set:
self.handlers.append(hdlr)
然后就可以了。
原因:python3.13.0 中的 logging 模块做了更改,把 logging._acquireLock()
和 logging._releaseLock()
简写成了 with logging._lock
。