You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Manim中使用相对导入?

如何在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包:

  1. public目录下创建pyproject.toml文件,内容如下:
    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    [project]
    name = "public"
    version = "0.1.0"
    
  2. 打开命令行,进入ManimProjects目录,执行安装命令:
    pip install -e ./public
    
    这样public就会被安装到你的Python环境中,任何项目都可以直接用from public.public_mobjects import ...导入,而且你修改public里的代码后,所有项目都会立刻生效(因为是可编辑安装)。

为什么相对导入会失败?

再补充说明下你遇到的报错原因:Python的相对导入(比如from ..public import ...)只有当模块是作为包的一部分被导入时才有效。而用manim命令运行scene.py时,Manim是把这个文件当作独立脚本执行的,此时该模块的__name____main__,Python会把它当成顶层模块,无法识别..这种相对路径,所以就会抛出ModuleNotFoundError

备注:内容来源于stack exchange,提问作者F. X. P.

火山引擎 最新活动