This commit is contained in:
Splines 2025-03-20 23:12:18 +01:00 committed by GitHub
commit 247a28361f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 5 deletions

View file

@ -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
@ -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

View file

@ -118,8 +118,8 @@ class InteractiveSceneEmbed:
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