加载插件 | NoneBot
Description: 跨平台 Python 异步 QQ 机器人框架

# # 加载插件

在 创建一个完整的项目 一章节中，我们已经创建了插件目录 `awesome_bot/plugins`，现在我们在机器人入口文件中加载它。当然，你也可以单独加载一个插件。

## # 加载内置插件

在 `bot.py` 文件中添加以下行：

    import nonebot

    nonebot.init()
    # 加载 nonebot 内置插件
    nonebot.load_builtin_plugins()

    app = nonebot.get_asgi()

    if __name__ == "__main__":
        nonebot.run()

1
2
3
4
5
6
7
8
9
10

这将会加载 nonebot 内置的插件，它包含：

- 命令 `say`：可由superuser使用，可以将消息内容由特殊纯文本转为富文本
- 命令 `echo`：可由任何人使用，将消息原样返回

以上命令均需要指定机器人，即私聊、群聊内@机器人、群聊内称呼机器人昵称。参考 Rule: to_me

## # 加载插件目录

在 `bot.py` 文件中添加以下行：

    import nonebot

    nonebot.init()
    # 加载插件目录，该目录下为各插件，以下划线开头的插件将不会被加载
    nonebot.load_plugins("awesome_bot/plugins")

    app = nonebot.get_asgi()

    if __name__ == "__main__":
        nonebot.run()

1
2
3
4
5
6
7
8
9
10

提示

加载插件目录时，目录下以 `_` 下划线开头的插件将不会被加载！

提示

不能存在相同名称的插件！

警告

插件间不应该存在过多的耦合，如果确实需要导入某个插件内的数据，可以参考 进阶-跨插件访问

## # 加载单个插件

在 `bot.py` 文件中添加以下行：

    import nonebot

    nonebot.init()
    # 加载一个 pip 安装的插件
    nonebot.load_plugin("nonebot_plugin_status")
    # 加载本地的单独插件
    nonebot.load_plugin("awesome_bot.plugins.xxx")

    app = nonebot.get_asgi()

    if __name__ == "__main__":
        nonebot.run()

1
2
3
4
5
6
7
8
9
10
11
12

## # 子插件(嵌套插件)

在插件中同样可以加载子插件，例如如下插件目录结构：

    foo_plugin
    ├── plugins
    │   ├── sub_plugin1
    │   │  └── __init__.py
    │   └── sub_plugin2.py
    ├── __init__.py
    └── config.py

在插件目录下的 `__init__.py` 中添加如下代码：

    from pathlib import Path

    import nonebot

    # store all subplugins
    _sub_plugins = set()
    # load sub plugins
    _sub_plugins |= nonebot.load_plugins(
        str((Path(__file__).parent / "plugins").resolve()))

1
2
3
4
5
6
7
8
9

插件将会被加载并存储于 `_sub_plugins` 中。

## # 运行结果

尝试运行 `nb run` 或者 `python bot.py`，可以看到日志输出了类似如下内容：

    09-19 21:51:59 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
    09-19 21:51:59 [INFO] nonebot | Succeeded to import "plugin_in_folder"

1
2