nonebot / nb-cli

NoneBot2 脚手架 / CLI for NoneBot2
https://cli.nonebot.dev
MIT License
156 stars 17 forks source link

Bug: 使用 --reload 加载项无法正常重新加载 #70

Closed OREOCODEDEV closed 1 year ago

OREOCODEDEV commented 1 year ago

描述问题:

使用 nb run --reload 命令启动的 NoneBot,在文件变更时无法自动重新加载,会引发 不同 的错误直接退出进程

如何复现?

  1. 使用 nb-cli 创建新NoneBot项目
  2. 使用 nb run --reload 命令启动NoneBot
  3. 在src文件夹中写入任意.py后缀文件
  4. 此时便会抛出Traceback,无法重新加载NoneBot2

由于不清楚是nb-cli的问题还是nonebot2的问题,所以先来这里开个issue了

*之前在2.0.0-beta2版本,通过.env文件中的fastapi_reload配置项设置的自动重新加载是正常的

*这个环境运行我写的一些 FastAPI 项目,使用uvicorn main:app --reload命令启动时能正常重新加载的

环境信息:

截图或日志

经过测试,每次自动重新加载抛出的Traeback位置都不完全一致,以下是观察到的几种在重新加载期间抛出的Traceback,可能不是全部的情况(不同Traceback期间项目没有任何改动)

第一种

Watchfiles detected changes in "C:\Users\OREO\Documents\Nonebot\KyaruDev\src\plugins\issue_demo.py". Reloading...
03-21 10:38:15 [INFO] uvicorn | Shutting down
03-21 10:38:15 [WARNING] nonebot | OneBot V11 | WebSocket for Bot 639396094 closed by peer
03-21 10:38:15 [INFO] websockets | connection closed
03-21 10:38:15 [INFO] uvicorn | Finished server process [18156]
03-21 10:38:15 [ERROR] uvicorn | Traceback (most recent call last):
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\starlette\routing.py", line 674, in lifespan
    await receive()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\uvicorn\lifespan\on.py", line 137, in receive
    return await self.receive_queue.get()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\asyncio\queues.py", line 159, in get
    await getter
asyncio.exceptions.CancelledError

Restarted process [18276].
Shutting down process [18276]...
Traceback (most recent call last):
  File "C:\Users\OREO\Documents\Nonebot\KyaruDev\bot.py", line 4, in <module>
    import nonebot
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\nonebot\__init__.py", line 42, in <module>
    from importlib.metadata import version
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\__init__.py", line 17, in <module>
    from . import _adapters, _meta
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 879, in exec_module
  File "<frozen importlib._bootstrap_external>", line 975, in get_code
  File "<frozen importlib._bootstrap_external>", line 1073, in get_data
KeyboardInterrupt
Stopped reloader.

第二种

Watchfiles detected changes in "C:\Users\OREO\Documents\Nonebot\KyaruDev\src\plugins\issue_demo.py". Reloading...
03-21 10:38:53 [INFO] uvicorn | Shutting down
03-21 10:38:53 [WARNING] nonebot | OneBot V11 | WebSocket for Bot 639396094 closed by peer
03-21 10:38:53 [INFO] websockets | connection closed
03-21 10:38:53 [INFO] uvicorn | Finished server process [16508]
03-21 10:38:53 [ERROR] uvicorn | Traceback (most recent call last):
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\starlette\routing.py", line 674, in lifespan
    await receive()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\uvicorn\lifespan\on.py", line 137, in receive
    return await self.receive_queue.get()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\asyncio\queues.py", line 159, in get
    await getter
asyncio.exceptions.CancelledError

Restarted process [17728].
Shutting down process [17728]...
Traceback (most recent call last):
  File "C:\Users\OREO\Documents\Nonebot\KyaruDev\bot.py", line 4, in <module>
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\nonebot\__init__.py", line 42, in <module>
    from importlib.metadata import version
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\__init__.py", line 17, in <module>
    from . import _adapters, _meta
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\_adapters.py", line 3, in <module>
    import email.message
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\email\message.py", line 15, in <module>
    from email import utils
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\email\utils.py", line 30, in <module>
    import datetime
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 879, in exec_module
  File "<frozen importlib._bootstrap_external>", line 1012, in get_code
  File "<frozen importlib._bootstrap_external>", line 672, in _compile_bytecode
KeyboardInterrupt
Stopped reloader.

第三种

Watchfiles detected changes in "C:\Users\OREO\Documents\Nonebot\KyaruDev\src\plugins\issue_demo.py". Reloading...
03-21 10:39:44 [INFO] uvicorn | Shutting down
03-21 10:39:44 [WARNING] nonebot | OneBot V11 | WebSocket for Bot 639396094 closed by peer
03-21 10:39:44 [INFO] websockets | connection closed
03-21 10:39:44 [INFO] uvicorn | Finished server process [5412]
03-21 10:39:44 [ERROR] uvicorn | Traceback (most recent call last):
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\starlette\routing.py", line 674, in lifespan
    await receive()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\uvicorn\lifespan\on.py", line 137, in receive
    return await self.receive_queue.get()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\asyncio\queues.py", line 159, in get
    await getter
asyncio.exceptions.CancelledError

Restarted process [17600].
Shutting down process [17600]...
Traceback (most recent call last):
  File "C:\Users\OREO\Documents\Nonebot\KyaruDev\bot.py", line 4, in <module>
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\nonebot\__init__.py", line 42, in <module>
    from importlib.metadata import version
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\__init__.py", line 124, in <module>
    class EntryPoint(
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\__init__.py", line 163, in EntryPoint
    dist: Optional['Distribution'] = None
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 309, in inner
    return cached(*args, **kwds)
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 403, in __getitem__
    return self._getitem(self, parameters)
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 529, in Optional
    arg = _type_check(parameters, f"{self} requires a single type.")
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 164, in _type_check
    arg = _type_convert(arg, module=module, allow_special_forms=allow_special_forms)
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 142, in _type_convert
    return ForwardRef(arg, module=module, is_class=allow_special_forms)
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 668, in __init__
    code = compile(arg, '<string>', 'eval')
KeyboardInterrupt
Stopped reloader.

第四种

Watchfiles detected changes in "C:\Users\OREO\Documents\Nonebot\test\src\plugins\test.py". Reloading...
03-21 10:41:40 [INFO] uvicorn | Shutting down
03-21 10:41:40 [INFO] uvicorn | Finished server process [13284]
03-21 10:41:40 [ERROR] uvicorn | Traceback (most recent call last):
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\starlette\routing.py", line 674, in lifespan
    await receive()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\uvicorn\lifespan\on.py", line 137, in receive
    return await self.receive_queue.get()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\asyncio\queues.py", line 159, in get
    await getter
asyncio.exceptions.CancelledError

Restarted process [18168].
Shutting down process [18168]...
Traceback (most recent call last):
  File "<string>", line 1, in <module>

Stopped reloader.
Watchfiles detected changes in "C:\Users\OREO\Documents\Nonebot\KyaruDev\src\plugins\issue_demo.py". Reloading...
03-21 10:43:30 [INFO] uvicorn | Shutting down
03-21 10:43:30 [WARNING] nonebot | OneBot V11 | WebSocket for Bot 639396094 closed by peer
03-21 10:43:30 [INFO] websockets | connection closed
03-21 10:43:30 [INFO] uvicorn | Finished server process [13880]
03-21 10:43:30 [ERROR] uvicorn | Traceback (most recent call last):
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\starlette\routing.py", line 674, in lifespan
    await receive()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\uvicorn\lifespan\on.py", line 137, in receive
    return await self.receive_queue.get()
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\asyncio\queues.py", line 159, in get
    await getter
asyncio.exceptions.CancelledError

Restarted process [18388].
Shutting down process [18388]...
Traceback (most recent call last):
  File "C:\Users\OREO\Documents\Nonebot\KyaruDev\bot.py", line 4, in <module>
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\site-packages\nonebot\__init__.py", line 42, in <module>
    from importlib.metadata import version
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\__init__.py", line 17, in <module>
    from . import _adapters, _meta
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\importlib\metadata\_meta.py", line 1, in <module>
    from typing import Any, Dict, Iterator, List, Protocol, TypeVar, Union
  File "C:\Users\OREO\AppData\Local\Programs\Python\Python310\lib\typing.py", line 2264, in <module>
    class NamedTupleMeta(type):
KeyboardInterrupt
Stopped reloader.
KotoriKoi commented 1 year ago

image 我也有类似的问题,使用nb run --reload启动,修改文件后连接直接关闭了,没有报错

KotoriKoi commented 1 year ago

image

另外使用nb run启动后ctrl+c无法终止进程,而是重启进程,重启后gocq一直报WARNING,不知道是哪个模块的问题。

OREOCODEDEV commented 1 year ago

又看了一下,每次Traceback不一样不会是因为这个 KeyboardInterrupt 每次抛出的时间节点有一些细小的差别导致的吧,那这样的话Traceback可能参考意义不是非常大了

forchannot commented 1 year ago

同,windows服务器server2022,使用reload模式启动修改任意内容后直接卡死,等几分钟无反应 7a17670aa8c81329

yanyongyu commented 1 year ago

你这个卡死是uvicorn还没shutdown完成,不是nbcli的问题,你可以检查一下是否有代码阻塞了进程退出

forchannot commented 1 year ago

哪类代码会阻塞呢,安装的插件太多了,不好全部一一排查(破案了,playwright的问题)