Skip to content

Bug: nb-cli 安装插件隐式依赖 pip #180

@Cypas

Description

@Cypas

操作系统

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"

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions