NoneBot 开发日志#1 浅谈插件

本文最后更新于 超过 3 年前,文中所描述的信息可能已发生改变。

虽说是开发日志,但实际上早就成了类似教程的东西了。

本文对应官方文档的加载插件创建插件部分,作为对官方文档的补充,推荐阅读完官方文档后再来阅读。

插件形式

在加载插件之前,我们首先需要知道插件在 NoneBot 中以怎样的形式存在。

单文件形式

多见于代码量较少的本地插件。

shell
├── plugins
   └── foobar.py

此时 foobar 便是一个插件目录 plugins 下的一个单文件形式插件。

包形式

多见于代码量较多的插件或插件商店中的插件。

使用 nb-cli 创建的插件均为此形式。

shell
├── plugins
   └── foobar
      └── __init__.py

此时 foobar 便是一个插件目录 plugins 下的一个包形式插件。

包形式插件本质上是依赖 NoneBot 的合法 Python 包,可以正常上传 PyPI。

加载插件

插件有四种加载方法,你知道么?

上一篇文章中我们试着运行了 NoneBot 的最小实例,其中有 nontbot.load_builtin_plugins() 这么一行代码,便是用来加载 NoneBot 内置的复读插件。

在 NoneBot 中,有四种较为常见的插件加载方式:load_pluginload_pluginsload_from_jsonload_from_toml,但本质上其实是三种,因为后面两种都是从文件中加载。

如果某个插件被成功加载,你会在运行日志中看到类似如下内容:

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

加载单个插件

load_plugin(module_path)

  • 说明 使用 PluginManager 加载单个插件,可以是本地插件或是通过 pip 安装的插件。
  • 参数
    • module_path: str: 插件名称 path.to.your.plugin
  • 返回
    • Optional[Plugin]

使用此函数只能加载单个插件,但除了可以加载本地插件之外,还可以加载通过 pip 安装的插件。

load_builtin_plugins() 实际上就是调用此函数来加载内置插件。

代码示例

python
# 加载通过 pip 安装的 nonebot_plugin_nodice
load_plugin("nonebot_plugin_nodice")

# 加载本地插件目录下的 csu_class
load_plugin("plugins/csu_class")

加载插件目录

load_plugins(*plugin_dir)

  • 说明 导入目录下多个插件,以 _ 开头的插件不会被导入!
  • 参数
    • *plugin_dir: str: 插件路径
  • 返回
    • Set[Plugin]

使用此函数可以加载多个目录下的多个插件,但只能加载本地插件。

加载插件目录时,目录下以 _ 下划线开头的插件将不会被加载。

注意不要把 load_plugin 和 load_plugins 搞混,否则容易出现想加载一个插件却把包里的每个文件都当作单独的插件加载了的乌龙~~(点名批评 nonebot_plugin_guess)~~。

代码示例

python
# 加载 plugins 目录下的所有插件
load_plugins("plugins")

从文件中加载

load_from_json(file_path, encoding='utf-8')

  • 说明 导入指定 json 文件中的 plugins 以及 plugin_dirs 下多个插件,以 _ 开头的插件不会被导入!
  • 参数
    • file_path: str: 指定 json 文件路径
    • encoding: str: 指定 json 文件编码
  • 返回
    • Set[Plugin]

代码示例

python
# 从 plugin.json 加载插件
load_from_json("plugins.json")

json 文件示例

json
{
    "plugins": ["nonebot_plugin_manager", "nonebot_plugin_trpglogger"],
    "plugin_dirs": ["plugins"]
}

load_from_toml(file_path, encoding='utf-8')

  • 说明 导入指定 toml 文件 [nonebot.plugins] 中的 plugins 以及 plugin_dirs 下多个插件, 以 _ 开头的插件不会被导入!
  • 参数
    • file_path: str: 指定 toml 文件路径
    • encoding: str: 指定 toml 文件编码
  • 返回
    • Set[Plugin]

代码示例

python
# 从 pyproject.toml 加载插件
load_from_toml("pyproject.toml")

toml 文件示例:

toml
[nonebot.plugins]
plugins = ["nonebot_plugin_manager", "nonebot_plugin_trpglogger"]
plugin_dirs = ["plugins"]

nb-cli 默认使用 pyproject.toml 加载插件。

同时 pyproject.toml 也是 poetry 默认的项目配置文件,这会在下一篇文章里讲到。

卸载插件

NoneBot2 并没有提供热卸载插件的方法,这是因为 importlib 这个包本身也没有提供热卸载 Python 包的方法。

如果想要卸载插件,就必须先将 bot.py 中加载该插件的代码删除,再重启 NoneBot。

记一次操蛋的终端美化经历
中文字符对齐之我见