首页 > 解决方案 > NameError: name 'open' is not defined 尝试登录文件时

问题描述

所以我选择在我的 discord.py 机器人中实现日志记录,这很好,花花公子,工作正常。但是一旦我将日志记录添加到文件中,无论是通过使用文件处理程序

handler = logging.FileHandler(
    filename="../logs/bot.log",
    mode="a")
formatter = logging.Formatter("%(asctime)s %(name)-30s %(levelname)-8s %(message)s")
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logging.getLogger().addHandler(handler)

或者通过 basicConfig

logging.basicConfig(filename="../logs/bot.log", filemode="a", format="%(asctime)s %(name)-30s %(levelname)-8s %(message)s", level=logging.DEBUG)

我总是在退出时得到这个 Traceback

Exception ignored in: <function ClientSession.__del__ at 0x7fe1330b9790>
Traceback (most recent call last):
  File "/home/lukas/PycharmProjects/coconutbot/venv/lib/python3.8/site-packages/aiohttp/client.py", line 314, in __del__
  File "/usr/lib/python3.8/asyncio/base_events.py", line 1740, in call_exception_handler
  File "/usr/lib/python3.8/logging/__init__.py", line 1463, in error
  File "/usr/lib/python3.8/logging/__init__.py", line 1577, in _log
  File "/usr/lib/python3.8/logging/__init__.py", line 1587, in handle
  File "/usr/lib/python3.8/logging/__init__.py", line 1649, in callHandlers
  File "/usr/lib/python3.8/logging/__init__.py", line 950, in handle
  File "/usr/lib/python3.8/logging/__init__.py", line 1182, in emit
  File "/usr/lib/python3.8/logging/__init__.py", line 1172, in _open
NameError: name 'open' is not defined
Exception ignored in: <function ClientResponse.__del__ at 0x7fe13300b430>
Traceback (most recent call last):
  File "/home/lukas/PycharmProjects/coconutbot/venv/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 757, in __del__
  File "/home/lukas/PycharmProjects/coconutbot/venv/lib/python3.8/site-packages/aiohttp/connector.py", line 177, in release
  File "/home/lukas/PycharmProjects/coconutbot/venv/lib/python3.8/site-packages/aiohttp/connector.py", line 629, in _release
  File "/home/lukas/PycharmProjects/coconutbot/venv/lib/python3.8/site-packages/aiohttp/client_proto.py", line 62, in close
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 690, in close
  File "/usr/lib/python3.8/asyncio/base_events.py", line 719, in call_soon
  File "/usr/lib/python3.8/asyncio/base_events.py", line 508, in _check_closed
RuntimeError: Event loop is closed

由于 Traceback 不包含我自己的任何文件,我完全不知道做错了什么。我怀疑我可能需要进行一些手动清理,但即使我这样做了,logging.shutdown()我也会得到相同的 Traceback

标签: pythonpython-3.xloggingdiscord.py

解决方案


那是因为某些东西(asyncio在这种情况下)试图在解释器的关闭阶段记录。

这是一个已知问题。该模块的解决方法logging已在 python 3.10 中实现

发生这种情况是因为在open文件处理程序有时间使用它之前,垃圾收集器已经删除了该名称。

您可以通过在程序退出之前尝试显式关闭/释放资源来避免此问题。


推荐阅读