14c0884fd0
previously module attributes like __file__ where not set correctly, leading to scripts getting the directory of the stable-diffusion repo location instead of their own script. This causes problem when loading user data from an external location using the --data-dir flag, as extensions would look for their own code in the stable-diffusion repo location instead of the data dir location. Using pythons importlib functions sets the modules specs correctly and executes them. But this will break extensions if they build paths based on the previously incorrect __file__ attribute.
32 lines
976 B
Python
32 lines
976 B
Python
import os
|
|
import sys
|
|
import traceback
|
|
import importlib.util
|
|
from types import ModuleType
|
|
|
|
|
|
def load_module(path):
|
|
module_spec = importlib.util.spec_from_file_location(os.path.basename(path), path)
|
|
module = importlib.util.module_from_spec(module_spec)
|
|
module_spec.loader.exec_module(module)
|
|
|
|
return module
|
|
|
|
|
|
def preload_extensions(extensions_dir, parser):
|
|
if not os.path.isdir(extensions_dir):
|
|
return
|
|
|
|
for dirname in sorted(os.listdir(extensions_dir)):
|
|
preload_script = os.path.join(extensions_dir, dirname, "preload.py")
|
|
if not os.path.isfile(preload_script):
|
|
continue
|
|
|
|
try:
|
|
module = load_module(preload_script)
|
|
if hasattr(module, 'preload'):
|
|
module.preload(parser)
|
|
|
|
except Exception:
|
|
print(f"Error running preload() for {preload_script}", file=sys.stderr)
|
|
print(traceback.format_exc(), file=sys.stderr)
|