Path: blob/master/scripts/custom_code.py
3055 views
import modules.scripts as scripts1import gradio as gr2import ast3import copy45from modules.processing import Processed6from modules.shared import cmd_opts789def convertExpr2Expression(expr):10expr.lineno = 011expr.col_offset = 012result = ast.Expression(expr.value, lineno=0, col_offset = 0)1314return result151617def exec_with_return(code, module):18"""19like exec() but can return values20https://stackoverflow.com/a/52361938/586297721"""22code_ast = ast.parse(code)2324init_ast = copy.deepcopy(code_ast)25init_ast.body = code_ast.body[:-1]2627last_ast = copy.deepcopy(code_ast)28last_ast.body = code_ast.body[-1:]2930exec(compile(init_ast, "<ast>", "exec"), module.__dict__)31if type(last_ast.body[0]) == ast.Expr:32return eval(compile(convertExpr2Expression(last_ast.body[0]), "<ast>", "eval"), module.__dict__)33else:34exec(compile(last_ast, "<ast>", "exec"), module.__dict__)353637class Script(scripts.Script):3839def title(self):40return "Custom code"4142def show(self, is_img2img):43return cmd_opts.allow_code4445def ui(self, is_img2img):46example = """from modules.processing import process_images4748p.width = 76849p.height = 76850p.batch_size = 251p.steps = 105253return process_images(p)54"""555657code = gr.Code(value=example, language="python", label="Python code", elem_id=self.elem_id("code"))58indent_level = gr.Number(label='Indent level', value=2, precision=0, elem_id=self.elem_id("indent_level"))5960return [code, indent_level]6162def run(self, p, code, indent_level):63assert cmd_opts.allow_code, '--allow-code option must be enabled'6465display_result_data = [[], -1, ""]6667def display(imgs, s=display_result_data[1], i=display_result_data[2]):68display_result_data[0] = imgs69display_result_data[1] = s70display_result_data[2] = i7172from types import ModuleType73module = ModuleType("testmodule")74module.__dict__.update(globals())75module.p = p76module.display = display7778indent = " " * indent_level79indented = code.replace('\n', f"\n{indent}")80body = f"""def __webuitemp__():81{indent}{indented}82__webuitemp__()"""8384result = exec_with_return(body, module)8586if isinstance(result, Processed):87return result8889return Processed(p, *display_result_data)909192