[Bf-blender-cvs] [0f1a63d34c0] blender2.8: PyAPI: add bpy.utils.execfile

Campbell Barton noreply at git.blender.org
Sun Nov 18 01:51:54 CET 2018


Commit: 0f1a63d34c048b11f93b167449741540901feb01
Author: Campbell Barton
Date:   Sun Nov 18 11:49:03 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB0f1a63d34c048b11f93b167449741540901feb01

PyAPI: add bpy.utils.execfile

Wraps `importlib.util`, avoids duplicate preset loading calls.

===================================================================

M	release/scripts/modules/bpy/utils/__init__.py
M	release/scripts/modules/bpy_extras/keyconfig_utils.py
M	release/scripts/startup/bl_operators/presets.py

===================================================================

diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index ba25deddf55..9889b16829b 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -51,6 +51,7 @@ __all__ = (
     "units",
     "unregister_class",
     "user_resource",
+    "execfile",
 )
 
 from _bpy import (
@@ -75,6 +76,18 @@ _script_module_dirs = "startup", "modules"
 _is_factory_startup = _bpy.app.factory_startup
 
 
+def execfile(filepath, mod=None):
+    # module name isn't used or added to 'sys.modules'.
+    # passing in 'mod' allows re-execution without having to reload.
+
+    import importlib.util
+    mod_spec = importlib.util.spec_from_file_location("__main__", filepath)
+    if mod is None:
+        mod = importlib.util.module_from_spec(mod_spec)
+    mod_spec.loader.exec_module(mod)
+    return mod
+
+
 def _test_import(module_name, loaded_modules):
     use_time = _bpy.app.debug_python
 
@@ -585,14 +598,7 @@ def keyconfig_set(filepath, report=None):
 
     try:
         error_msg = ""
-        with open(filepath, 'r', encoding='utf-8') as keyfile:
-            exec(
-                compile(keyfile.read(), filepath, "exec"),
-                {
-                    "__file__": filepath,
-                    "__name__": "__main__",
-                }
-            )
+        execfile(filepath)
     except:
         import traceback
         error_msg = traceback.format_exc()
diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils.py b/release/scripts/modules/bpy_extras/keyconfig_utils.py
index 4d5ec5286ec..eb727167d33 100644
--- a/release/scripts/modules/bpy_extras/keyconfig_utils.py
+++ b/release/scripts/modules/bpy_extras/keyconfig_utils.py
@@ -511,7 +511,7 @@ def keyconfig_import_from_data(name, keyconfig_data):
 
 def keyconfig_module_from_preset(name, preset_reference_filename=None):
     import os
-    import importlib.util
+    import bpy
     if preset_reference_filename is not None:
         preset_path = os.path.join(os.path.dirname(preset_reference_filename), name + ".py")
     else:
@@ -521,11 +521,7 @@ def keyconfig_module_from_preset(name, preset_reference_filename=None):
     if not (preset_path and os.path.exists(preset_path)):
         preset_path = bpy.utils.preset_find(name, "keyconfig")
 
-    # module name isn't used or added to 'sys.modules'.
-    mod_spec = importlib.util.spec_from_file_location("__main__", preset_path)
-    mod = importlib.util.module_from_spec(mod_spec)
-    mod_spec.loader.exec_module(mod)
-    return mod
+    return bpy.utils.execfile(preset_path)
 
 
 # -----------------------------------------------------------------------------
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index f66c7082033..3e08bd1fe6f 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -246,10 +246,8 @@ class ExecutePreset(Operator):
             preset_class.reset_cb(context)
 
         if ext == ".py":
-            import importlib.util
-            mod_spec = importlib.util.spec_from_file_location("__main__", filepath)
             try:
-                mod_spec.loader.exec_module(importlib.util.module_from_spec(mod_spec))
+                bpy.utils.execfile(filepath)
             except Exception as ex:
                 self.report({'ERROR'}, "Failed to execute the preset: " + repr(ex))



More information about the Bf-blender-cvs mailing list