linux 配置 manim 过程中的一些问题记录

最近看 3B1B 心血来潮,想着自己整个里面的动画引擎 manim 玩玩,遂开始了配置,一开始想着是在 wsl 里面配置,但是遇到了很多奇怪的问题,总结下来是我的 wsl 里面没有装任何的渲染引擎导致的,然后里面也没装 latex,所以最后是在 windows 里面再装了一个

另外我是直接下载源码然后 pip install -e . 的,感觉如果直接 pip install manimgl 会简单很多

配置方法

如果要下载源码,完整的配置方法为:

  1. 下载 FFmpeg
    • windows 参考 这里
    • linux 直接 sudo apt update && sudo apt install ffmpeg 即可
  2. 下载 latex
    • windows 可以用清华镜像,在里面找到最新的 iso 文件下载即可
    • linux 直接 sudo apt update && sudo apt install texlive-full
    • 注意 texlive 肥硕的身材
  3. 下载源码并安装(建议虚拟环境)
    1
    2
    3
    git clone https://github.com/3b1b/manim.git
    cd manim
    pip install -e .

如果只希望使用 manim 工具,将最后一项换成 pip install manimgl 即可

问题记录

python 版本问题

官方推荐的版本是 >=3.7,README 里面写了如下命令 conda create -n manim python=3.8,所以我第一次装的时候就按照 python 3.8 来装了,很快遇到第一个问题:

1
2
3
4
5
6
7
8
9
manim_slides/slide/manimlib.py:4: in <module>
from manimlib import Scene, ThreeDCamera
.venv/lib/python3.9/site-packages/manimlib/__init__.py:12: in <module>
from manimlib.window import *
.venv/lib/python3.9/site-packages/manimlib/window.py:20: in <module>
class Window(PygletWindow):
.venv/lib/python3.9/site-packages/manimlib/window.py:117: in Window
def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> None:
TypeError: 'staticmethod' object is not callable

虽然我想出的第一个办法是把 @staticmethod 都注释了(而且还真有用),但是这显然很愚蠢,然后我在 issue 里面翻到了 这个

省流:python < 3.10 的时候是不支持静态方法被调用的,这是 python 本身的 bug,然后这个代码太 OOP 导致静态方法在某些神奇地方被调用而出错

因此需要用 python >= 3.10

OpenGL 依赖问题

解决了上述版本问题之后其实有很多问题也一并得到了解决,包括 setup.cfg 中的很多包版本问题

之后,运行的时候会在尝试 from OpenGL.GL import * as gl 的时候出现:

1
2
3
4
5
6
7
8
9
10
11
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ywang/miniconda3/envs/manim/lib/python3.11/site-packages/OpenGL/GL/__init__.py", line 4, in <module>
from OpenGL.GL.VERSION.GL_1_1 import *
File "/home/ywang/miniconda3/envs/manim/lib/python3.11/site-packages/OpenGL/GL/VERSION/GL_1_1.py", line 14, in <module>
from OpenGL.raw.GL.VERSION.GL_1_1 import *
File "/home/ywang/miniconda3/envs/manim/lib/python3.11/site-packages/OpenGL/raw/GL/VERSION/GL_1_1.py", line 7, in <module>
from OpenGL.raw.GL import _errors
File "/home/ywang/miniconda3/envs/manim/lib/python3.11/site-packages/OpenGL/raw/GL/_errors.py", line 4, in <module>
_error_checker = _ErrorChecker( _p, _p.GL.glGetError )
AttributeError: 'NoneType' object has no attribute 'eglGetCurrentContext'

首先我在这个 issue 下面找到了解决方案,即:

1
2
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libglut.so.3.12 libglut.so.3

看上去是在帮助系统能够找到 libglut 这个库,但是这个方法对我并没有作用

最后在这个 issue 下面找到了有用的解决方案,本质是没有安装各种图形化引擎:

1
2
3
sudo apt-get install freeglut3-dev
sudo apt install freeglut3-dev freeglut3 libgl1-mesa-dev libglu1-mesa-dev libxext-dev libxt-dev
sudo apt install python3-opengl libgl1-mesa-glx libglu1-mesa

遂成功运行样例

最终解决

然后样例跑到一半炸了

一看报错:no latex,然后发现我好像确实没有用 wsl 写过 latex,但是又不太想在 wsl 里面再装这一坨,于是就在 windows 里面直接重装了,花费了我整整 5 分钟就装好了,并且丝滑运行样例

生气中


© 2024 本网站由 Ywang22 使用 Stellar 创建
总访问 次 | 本页访问
共发表 64 篇 Blog(s) · 总计 146.2k 字