如何在Manim中使用相对导入?
我明白你遇到的问题了——用Python标准的相对导入在Manim里跑不通,确实挺头疼的,毕竟Manim的运行机制和直接执行Python脚本不太一样。你遇到的ModuleNotFoundError本质原因是:当通过manim命令运行你的scene.py时,Manim是把这个文件作为独立脚本执行的,而非作为包的一部分加载,这时候Python的相对导入规则就不适用了。
下面是几个亲测有效的解决方法,你可以根据自己的需求选择:
方法一:手动将项目根目录加入Python搜索路径(最直接)
在每个项目的scene.py开头,先把ManimProjects根目录添加到Python的模块搜索路径中,这样就能直接用绝对导入引用public里的内容了。
比如在Project1/scene.py的最顶部添加:
import sys from pathlib import Path # 获取当前文件的父目录的父目录,也就是ManimProjects根目录 project_root = Path(__file__).parent.parent # 将根目录加入Python路径 sys.path.append(str(project_root)) # 现在可以直接导入public模块了 from public.public_mobjects import 你需要的类或函数
这个方法的好处是不用改任何环境配置,每个项目单独处理,适合快速解决问题。
方法二:通过环境变量PYTHONPATH指定根目录
你可以把ManimProjects的路径设置到PYTHONPATH环境变量中,这样Python会自动在这个路径下搜索模块,不管你运行哪个项目的scene.py都能直接导入public。
- Windows命令行临时配置:
set PYTHONPATH=D:\你的路径\ManimProjects manim Project1/scene.py 你的场景名 - VSCode中持久化配置:
如果你用VSCode的Manim Sideview插件,可以在.vscode/settings.json里添加环境变量配置,这样每次运行都会自动生效:{ "terminal.integrated.env.windows": { "PYTHONPATH": "D:\\你的路径\\ManimProjects" } }
方法三:将public目录作为可编辑包安装(适合长期使用)
如果你的public模块会频繁更新,想让所有项目自动同步最新版本,可以把它做成一个可编辑的Python包:
- 在
public目录下创建pyproject.toml文件,内容如下:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "public" version = "0.1.0" - 打开命令行,进入
ManimProjects目录,执行安装命令:
这样pip install -e ./publicpublic就会被安装到你的Python环境中,任何项目都可以直接用from public.public_mobjects import ...导入,而且你修改public里的代码后,所有项目都会立刻生效(因为是可编辑安装)。
为什么相对导入会失败?
再补充说明下你遇到的报错原因:Python的相对导入(比如from ..public import ...)只有当模块是作为包的一部分被导入时才有效。而用manim命令运行scene.py时,Manim是把这个文件当作独立脚本执行的,此时该模块的__name__是__main__,Python会把它当成顶层模块,无法识别..这种相对路径,所以就会抛出ModuleNotFoundError。
备注:内容来源于stack exchange,提问作者F. X. P.




