Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-02-16 07:51:04 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-02-16 08:00:03 +0300
commit7bb5e4a3c192a0c09d2877eed7808b215fff5abb (patch)
treef8dd367e00a15620d24bf3a2c432d768ca5f435b /release
parentf34d5d99dce8dde6559e7d5ebd8060cc942a7491 (diff)
Fix reloading preferences ignoring 'script_directory'
Reloading preferences didn't update Python's `sys.path` to account for the modified `script_directory`. This meant the operator to load settings from a previous version required a restart to initialize Python when this directory was set.
Diffstat (limited to 'release')
-rw-r--r--release/scripts/modules/bpy/utils/__init__.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 7f39cc5d422..d984a6f54a4 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -121,15 +121,25 @@ def _test_import(module_name, loaded_modules):
return mod
-# Reloading would add twice.
+# Check before adding paths as reloading would add twice.
+
+# Storing and restoring the full `sys.path` is risky as this may be intentionally modified
+# by technical users/developers.
+#
+# Instead, track which paths have been added, clearing them before refreshing.
+# This supports the case of loading a new preferences file which may reset scripts path.
+_sys_path_ensure_paths = set()
+
def _sys_path_ensure_prepend(path):
if path not in _sys.path:
_sys.path.insert(0, path)
+ _sys_path_ensure_paths.add(path)
def _sys_path_ensure_append(path):
if path not in _sys.path:
_sys.path.append(path)
+ _sys_path_ensure_paths.add(path)
def modules_from_path(path, loaded_modules):
@@ -391,6 +401,13 @@ def refresh_script_paths():
Run this after creating new script paths to update sys.path
"""
+ for path in _sys_path_ensure_paths:
+ try:
+ _sys.path.remove(path)
+ except ValueError:
+ pass
+ _sys_path_ensure_paths.clear()
+
for base_path in script_paths():
for path_subdir in _script_module_dirs:
path = _os.path.join(base_path, path_subdir)