mirror of
https://github.com/3b1b/manim.git
synced 2025-08-19 21:08:53 +00:00
Merge 02ddf45664
into f4737828f6
This commit is contained in:
commit
247a28361f
2 changed files with 18 additions and 5 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue