Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix module exec #2308

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions manimlib/extract_scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,11 @@ def get_indent(code_lines: list[str], line_number: int) -> str:
return n_spaces * " "


def insert_embed_line_to_module(module: Module, run_config: Dict) -> None:
def insert_embed_line_to_module_exec(module: Module, run_config: Dict) -> None:
"""
Loads the user code, inserts a self.embed() line at the given line_number
and executes the code.

This is hacky, but convenient. When user includes the argument "-e", it will try
to recreate a file that inserts the line `self.embed()` into the end of the scene's
construct method. If there is an argument passed in, it will insert the line after
Expand Down Expand Up @@ -174,14 +177,24 @@ def insert_embed_line_to_module(module: Module, run_config: Dict) -> None:

# Execute the code, which presumably redefines the user's
# scene to include this embed line, within the relevant module.
code_object = compile(new_code, module.__name__, 'exec')
# Note that we add the user-module to sys.modules to please Python builtins
# that rely on cls.__module__ to be not None (which would be the case if
# the module was not in sys.modules). See #2307.
if module.__name__ in sys.modules:
log.error(
"Module name is already used by Manim itself, "
"please use a different name"
)
sys.exit(2)
sys.modules[module.__name__] = module
code_object = compile(new_code, module.__name__, "exec")
exec(code_object, module.__dict__)


def get_module(run_config: Dict) -> Module:
module = ModuleLoader.get_module(run_config.file_name, run_config.is_reload)
if run_config.embed_line:
insert_embed_line_to_module(module, run_config)
insert_embed_line_to_module_exec(module, run_config)
return module


Expand Down
4 changes: 2 additions & 2 deletions manimlib/scene/scene_embed.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ def reload_scene(self, embed_line: int | None = None) -> None:
open during the reload.

If `embed_line` is provided, the scene will be reloaded at that line
number. This corresponds to the `linemarker` param of the
`extract_scene.insert_embed_line_to_module()` method.
number. This corresponds to the `line_number` param of the
`extract_scene.insert_embed_line_to_module_exec()` method.

Before reload, the scene is cleared and the entire state is reset, such
that we can start from a clean slate. This is taken care of by the
Expand Down