插件机制¶
插件(plugin)是把自定义 mobject、动画、工具函数打包成 Python 包、随 pip 分发的机制。你的场景文件只要多一行 import,就能使用插件提供的全部内容;本节介绍发现、安装、编写插件的方式。
插件的发现机制¶
Manim 使用 Python 标准的 entry points 机制发现插件:一个包只要在打包元数据里声明自己属于 manim.plugins 组,就会被 manim plugins -l 列出来。
对插件作者而言,声明方式是在 pyproject.toml 里加一个 entry points 表:
[project.entry-points."manim.plugins"]
mypackage = "mypackage"
mypackage = "mypackage" 的含义:entry point 的名字(左侧)是插件名,右侧是 import 时执行的模块路径。安装这个包(pip install .)之后,它就出现在插件列表里。
对用户而言,查看本机已安装的插件:
manim plugins -l
输出形如:
Plugins:
• manim_mobject_svg
manim plugins 子命令只有 -l/--list 一个选项,仅负责列出插件,不负责安装或卸载——安装就是普通的 pip install,卸载是 pip uninstall。
在场景中使用插件¶
插件被列出不等于其内容自动可用。在 v0.21.0,使用插件内容需要在场景文件里显式导入:
from manim import *
from manim_mobject_svg import SVGMobject # 插件提供的类
配置项 [CLI] plugins(逗号分隔的插件名列表)仍然存在:Manim 在导入时会核对这些插件是否已安装,缺失的会在日志中给出警告(Missing Plugins: ...)。它是一个“声明依赖、及早报警”的机制,不再触发自动导入。
版本说明
在 v0.18.0 及更早版本中,配置 [CLI] plugins 里列出的插件会在 import manim 时被自动导入;v0.18.1 移除了这一行为,改为显式 import。从旧版本迁移的脚本,需要在文件顶部补上对插件的导入语句。见“杂项”一节的废弃提醒写法与本节说明。
常见错误
manim plugins -l 能列出某插件,但场景里 SomeClass 报 NameError——列出只说明 entry point 存在,不代表名字进了命名空间。检查场景文件顶部是否真的 import 了插件提供的模块。
社区插件举例¶
社区维护的插件覆盖了演示播放、物理模拟、机器学习可视化等方向(可用性随时间变化,安装前请以 PyPI 页面为准):
manim-slides:把场景导出为可键盘控制的演示幻灯片,带后退、跳过、触碰翻页等功能,是最流行的 Manim 生态插件之一manim-physics:引力场、电磁场、刚体等物理模拟可视化组件manim-ml:神经网络、Transformer 等机器学习结构的可视化manim_mobject_svg:把任意VMobject导出为 SVG 文件(本机已安装,可用manim plugins -l看到)
这些插件的用法一致:安装后在场景文件顶部显式导入。
编写自己的插件¶
最小可行插件只有三步:
写一个普通 Python 包(
pyproject.toml+ 你的模块),内容就是你想复用的 mobject / 动画 / 工具函数。在
pyproject.toml中添加上文的[project.entry-points."manim.plugins"]声明。pip install .后manim plugins -l能列出它,场景文件import即可使用。
换言之,插件包本身没有任何 Manim 特有的代码结构要求——entry point 只是一枚“我是 Manim 插件”的徽章。
提示
插件里的自定义 mobject、自定义 Animation 遵循本节前两节的原则:继承 VMobject 重写 generate_points,或继承 Animation 重写插值钩子。把调试工具(如 manim.utils.debug 的 index_labels)一并收进插件,团队的调试体验也会一致。
常见错误与建议¶
常见错误
不要在插件模块顶层执行重活(连接网络、渲染测试片段)。entry point 的加载发生在 manim plugins -l 等命令中,顶层代码会被立即执行,拖慢所有命令并可能在没有显示环境的机器上失败。
自测¶
✏️ 练习
安装了某个插件后,场景里直接使用它提供的类却报 NameError,但 manim plugins -l 能列出它。可能是什么原因?
✅ 参考答案
v0.18.1 起插件不再自动导入,entry point 只负责“登记”。需要在场景文件顶部显式 import 插件提供的模块,名字才会进入命名空间。
✏️ 练习
如何把自己写的 FancyBanner mobject 打包成插件供他人 pip install 使用?
✅ 参考答案
最小做法:建一个 Python 包,把 FancyBanner 放进模块里;在 pyproject.toml 添加 [project.entry-points."manim.plugins"] 表(包名 = "模块路径");pip install . 发布或本地安装。使用者 pip install 后在场景文件里显式导入即可。
下一步¶
插件解决“代码如何分享”,接下来的三节转向“渲染如何受控”:先深入配置系统,再看性能与缓存,最后把 CLI 的全部选项一次讲透。