diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-02-16 07:51:04 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-02-16 08:00:03 +0300 |
commit | 7bb5e4a3c192a0c09d2877eed7808b215fff5abb (patch) | |
tree | f8dd367e00a15620d24bf3a2c432d768ca5f435b /release | |
parent | f34d5d99dce8dde6559e7d5ebd8060cc942a7491 (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__.py | 19 |
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) |