nb-cli
nb-cli copied to clipboard
Bug: nb-cli 安装插件隐式依赖 pip
操作系统
Linux
Python 版本
3.10
NoneBot 版本
2.4.4
适配器
onebot 2.4.6
协议端
none
描述问题
安装插件过程中提示 pip is not installed 系统内python环境为conda启动的py310 nb-cli是正常通过pipx install nb-cli 进行安装的,也已经重试 项目目录最早是nb create生成的,后来删掉了.venv文件夹,用uv sync进行了重建,会不会是uv创建的环境和nb create创建的环境存在一定区别?
复现步骤
系统内python环境为conda启动的py310 nb-cli是正常通过pipx install nb-cli 进行安装的,也已经重试 项目目录最早是nb create生成的,后来删掉了.venv文件夹,用uv sync进行了重建 然后nb plugin install 插件过程中报错
期望的结果
No response
截图或日志
附日志截图 和 pyproject.toml文件结构
(nb2-py310) ubuntu@VM-8-5-ubuntu:/www/bot/nb_bot_bak$ nb
Using python: /www/bot/nb_bot_bak/.venv/bin/python
d8b db .d88b. d8b db d88888b d8888b. .d88b. d888888b
888o 88 .8P Y8. 888o 88 88' 88 `8D .8P Y8. `~~88~~'
88V8o 88 88 88 88V8o 88 88ooooo 88oooY' 88 88 88
88 V8o88 88 88 88 V8o88 88~~~~~ 88~~~b. 88 88 88
88 V888 `8b d8' 88 V888 88. 88 8D `8b d8' 88
VP V8P `Y88P' VP V8P Y88888P Y8888P' `Y88P' YP
Welcome to NoneBot CLI!
[?] What do you want to do? Manage bot plugins.
[?] What do you want to do? Install nonebot plugin to current project.
[?] Plugin name to install: splatoon3游戏日程查询 (一个基于nonebot2框架的splatoon3游戏日程查询插件)
Traceback (most recent call last):
File "/home/ubuntu/.local/bin/nb", line 7, in <module>
sys.exit(main())
~~~~^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/__main__.py", line 10, in main
anyio.run(cli_main, *args)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_core/_eventloop.py", line 75, in run
return async_backend.run(func, args, {}, backend_options)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2365, in run
return runner.run(wrapper())
~~~~~~~~~~^^^^^^^^^^^
File "/home/ubuntu/miniconda3/lib/python3.13/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/home/ubuntu/miniconda3/lib/python3.13/asyncio/base_events.py", line 725, in run_until_complete
return future.result()
~~~~~~~~~~~~~^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2348, in wrapper
return await func(*args)
^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/__init__.py", line 35, in cli_main
return await run_sync(cli_sync)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/utils.py", line 106, in wrapper
return await anyio.to_thread.run_sync(partial(func, *args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/to_thread.py", line 61, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2525, in run_sync_in_worker_thread
return await future
^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 986, in run
result = context.run(func, *args)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 1485, in __call__
return self.main(*args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 1406, in main
rv = self.invoke(ctx)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 1851, in invoke
rv = super().invoke(ctx)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 1269, in invoke
return ctx.invoke(self.callback, **ctx.params)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 824, in invoke
return callback(*args, **kwargs)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/decorators.py", line 34, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/utils.py", line 114, in wrapper
return anyio.from_thread.run(partial(func, *args, **kwargs))
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/from_thread.py", line 90, in run
return token.backend_class.run_async_from_thread(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
func, args, token=token.native_token if explicit_token else None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2572, in run_async_from_thread
return f.result()
~~~~~~~~^^
File "/home/ubuntu/miniconda3/lib/python3.13/concurrent/futures/_base.py", line 456, in result
return self.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/ubuntu/miniconda3/lib/python3.13/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2553, in task_wrapper
return await func(*args)
^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/__init__.py", line 130, in cli
await run_sync(ctx.invoke)(sub_cmd)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/utils.py", line 106, in wrapper
return await anyio.to_thread.run_sync(partial(func, *args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/to_thread.py", line 61, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2525, in run_sync_in_worker_thread
return await future
^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 986, in run
result = context.run(func, *args)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 824, in invoke
return callback(*args, **kwargs)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/decorators.py", line 34, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/utils.py", line 114, in wrapper
return anyio.from_thread.run(partial(func, *args, **kwargs))
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/from_thread.py", line 90, in run
return token.backend_class.run_async_from_thread(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
func, args, token=token.native_token if explicit_token else None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2572, in run_async_from_thread
return f.result()
~~~~~~~~^^
File "/home/ubuntu/miniconda3/lib/python3.13/concurrent/futures/_base.py", line 456, in result
return self.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/ubuntu/miniconda3/lib/python3.13/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2553, in task_wrapper
return await func(*args)
^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/commands/plugin.py", line 66, in plugin
await run_sync(ctx.invoke)(sub_cmd)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/utils.py", line 106, in wrapper
return await anyio.to_thread.run_sync(partial(func, *args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/to_thread.py", line 61, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2525, in run_sync_in_worker_thread
return await future
^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 986, in run
result = context.run(func, *args)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/core.py", line 824, in invoke
return callback(*args, **kwargs)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/click/decorators.py", line 34, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/utils.py", line 114, in wrapper
return anyio.from_thread.run(partial(func, *args, **kwargs))
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/from_thread.py", line 90, in run
return token.backend_class.run_async_from_thread(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
func, args, token=token.native_token if explicit_token else None
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2572, in run_async_from_thread
return f.result()
~~~~~~~~^^
File "/home/ubuntu/miniconda3/lib/python3.13/concurrent/futures/_base.py", line 456, in result
return self.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/ubuntu/miniconda3/lib/python3.13/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2553, in task_wrapper
return await func(*args)
^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/cli/commands/plugin.py", line 163, in install
proc = await call_pip_install(
^^^^^^^^^^^^^^^^^^^^^^^
plugin.as_dependency(not no_restrict_version), pip_args
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/handlers/meta.py", line 152, in wrapper
return await func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.local/share/pipx/venvs/nb-cli/lib/python3.13/site-packages/nb_cli/handlers/meta.py", line 276, in wrapper
raise PipError(_("pip is not installed."))
nb_cli.exceptions.PipError: pip is not installed.
(nb2-py310) ubuntu@VM-8-5-ubuntu:/www/bot/nb_bot_bak$
pyproject.toml 文件结构
[project]
name = "nb_bot_bak"
version = "0.1.0"
description = "nb_bot_bak"
readme = "README.md"
requires-python = ">=3.10, <4.0"
dependencies = [
"nonebot2[fastapi]>=2.4.4",
"nonebot2[httpx]>=2.4.4",
"nonebot2[websockets]>=2.4.4",
"nonebot-adapter-onebot>=2.4.6",
"nonebot-adapter-telegram>=0.1.0b20",
"nonebot-adapter-qq>=1.6.6",
"nonebot-adapter-kaiheila>=0.3.4",
"nonebot-plugin-localstore>=0.7.4",
"nonebot-plugin-apscheduler>=0.5.0",
"nonebot-plugin-splatoon3_schedule>=2.0.0",
"nonebot-plugin-splatoon3-nso>=1.7.5",
]
[project.optional-dependencies]
dev = [
"pyright[nodejs]",
"ruff"
]
[tool.nonebot]
plugin_dirs = ["nb_bot/plugins"]
builtin_plugins = []
[tool.nonebot.adapters]
nonebot-adapter-onebot = [
{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" },
{ name = "OneBot V12", module_name = "nonebot.adapters.onebot.v12" }
]
nonebot-adapter-telegram = [
{ name = "Telegram", module_name = "nonebot.adapters.telegram" }
]
nonebot-adapter-qq = [
{ name = "QQ", module_name = "nonebot.adapters.qq" }
]
nonebot-adapter-kaiheila = [
{ name = "开黑啦", module_name = "nonebot.adapters.kaiheila" }
]
"@local" = []
[tool.nonebot.plugins]
"@local" = []
nonebot-plugin-localstore = ["nonebot_plugin_localstore"]
nonebot-plugin-apscheduler = ["nonebot_plugin_apscheduler"]
[tool.ruff]
line-length = 88
target-version = "py39"
[tool.ruff.format]
line-ending = "lf"
[tool.ruff.lint]
# For more rules, see https://docs.astral.sh/ruff/rules/.
select = [
"F", # Pyflakes
"W", # pycodestyle warnings
"E", # pycodestyle errors
"I", # isort
"C90", # mccabe
"N", # pep8-naming
"PL", # pylint
"UP", # pyupgrade
"YTT", # flake8-2020
"ANN", # flake8-annotations
"ASYNC", # flake8-async
"BLE", # flake8-blind-except
"FBT", # flake8-boolean-trap
"B", # flake8-bugbear
"A", # flake8-builtins
"COM", # flake8-commas
"C4", # flake8-comprehensions
"DTZ", # flake8-datetimez
"T10", # flake8-debugger
"ICN", # flake8-import-conventions
"PIE", # flake8-pie
"T20", # flake8-print
"PYI", # flake8-pyi
"Q", # flake8-quotes
"RSE", # flake8-raise
"RET", # flake8-return
"SIM", # flake8-simplify
"SLOT", # flake8-slots
"TID", # flake8-tidy-imports
"TC", # flake8-type-checking
"ARG", # flake8-unused-arguments
"PTH", # flake8-use-pathlib
# "ERA", # eradicate
"FAST", # FastAPI
"PERF", # Perflint
"PGH", # pygrep-hooks
"FURB", # refurb
"TRY", # tryceratops
"RUF", # Ruff-specific rules
]
ignore = [
"E402", # module-import-not-at-top-of-file # nonebot2 require() violates this
"B008", # function-call-in-default-argument # nonebot2 Depends() without Annotated violates this
"UP037", # quoted-annotation
# "RUF001", # ambiguous-unicode-character-string
# "RUF002", # ambiguous-unicode-character-docstring
# "RUF003", # ambiguous-unicode-character-comment
# "ANN201", # missing-return-type-undocumented-public-function
"ANN202", # missing-return-type-private-function
"ANN401", # any-type
"COM812", # missing-trailing-comma
"PLC0415", # import-outside-top-level
]
allowed-confusables = [",", "。", "“", "”", ":", ";", "?", "!", "【", "】", "《", "》", "…", "—", "(", ")", "、"]
[tool.ruff.lint.pyupgrade]
keep-runtime-typing = true
[tool.pyright]
# For Pylance/Pyright configurations, see https://microsoft.github.io/pyright/#/configuration.
pythonVersion = "3.9"
pythonPlatform = "All"
typeCheckingMode = "standard"
uv 的 venv 内不存在 pip,无法通过 pip 安装插件,你可以手动用 uv 安装。或者 @NCBM 看看有没有什么办法。