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 * " " 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 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 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 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 # Execute the code, which presumably redefines the user's
# scene to include this embed line, within the relevant module. # 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__) exec(code_object, module.__dict__)
def get_module(run_config: Dict) -> Module: def get_module(run_config: Dict) -> Module:
module = ModuleLoader.get_module(run_config.file_name, run_config.is_reload) module = ModuleLoader.get_module(run_config.file_name, run_config.is_reload)
if run_config.embed_line: if run_config.embed_line:
insert_embed_line_to_module(module, run_config) insert_embed_line_to_module_exec(module, run_config)
return module return module

View file

@ -118,8 +118,8 @@ class InteractiveSceneEmbed:
open during the reload. open during the reload.
If `embed_line` is provided, the scene will be reloaded at that line If `embed_line` is provided, the scene will be reloaded at that line
number. This corresponds to the `linemarker` param of the number. This corresponds to the `line_number` param of the
`extract_scene.insert_embed_line_to_module()` method. `extract_scene.insert_embed_line_to_module_exec()` method.
Before reload, the scene is cleared and the entire state is reset, such 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 that we can start from a clean slate. This is taken care of by the