WebUI/modules/scripts.py

54 lines
1.3 KiB
Python

import os
import sys
import traceback
import gradio as gr
class Script:
filename = None
def title(self):
raise NotImplementedError()
scripts = []
def load_scripts(basedir, globs):
for filename in os.listdir(basedir):
path = os.path.join(basedir, filename)
if not os.path.isfile(path):
continue
with open(path, "r", encoding="utf8") as file:
text = file.read()
from types import ModuleType
compiled = compile(text, path, 'exec')
module = ModuleType(filename)
module.__dict__.update(globs)
exec(compiled, module.__dict__)
for key, item in module.__dict__.items():
if type(item) == type and issubclass(item, Script):
item.filename = path
scripts.append(item)
def wrap_call(func, filename, funcname, *args, default=None, **kwargs):
try:
res = func()
return res
except Exception:
print(f"Error calling: {filename/funcname}", file=sys.stderr)
print(traceback.format_exc(), file=sys.stderr)
return default
def setup_ui():
titles = [wrap_call(script.title, script.filename, "title") for script in scripts]
gr.Dropdown(options=[""] + titles, value="", type="index")