forked from gradio-app/gradio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreload.py
104 lines (84 loc) · 3.09 KB
/
reload.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"""
Contains the functions that run when `gradio` is called from the command line. Specifically, allows
$ gradio app.py, to run app.py in reload mode where any changes in the app.py file or Gradio library reloads the demo.
$ gradio app.py my_demo, to use variable names other than "demo"
"""
import inspect
import os
import re
import subprocess
import sys
import threading
from pathlib import Path
import gradio
from gradio import utils
reload_thread = threading.local()
def _setup_config():
args = sys.argv[1:]
if len(args) == 0:
raise ValueError("No file specified.")
if len(args) == 1 or args[1].startswith("--"):
demo_name = "demo"
else:
demo_name = args[1]
if "." in demo_name:
demo_name = demo_name.split(".")[0]
print(
"\nWARNING: As of Gradio 3.41.0, the parameter after the file path must be the name of the Gradio demo, not the FastAPI app. In most cases, this just means you should remove '.app' after the name of your demo, e.g. 'demo.app' -> 'demo'."
)
original_path = args[0]
app_text = Path(original_path).read_text()
patterns = [
f"with gr\\.Blocks\\(\\) as {demo_name}",
f"{demo_name} = gr\\.Blocks",
f"{demo_name} = gr\\.Interface",
f"{demo_name} = gr\\.ChatInterface",
f"{demo_name} = gr\\.Series",
f"{demo_name} = gr\\.Paralles",
f"{demo_name} = gr\\.TabbedInterface",
]
if not any(re.search(p, app_text) for p in patterns):
print(
f"\nWarning: Cannot statically find a gradio demo called {demo_name}. "
"Reload work may fail."
)
abs_original_path = utils.abspath(original_path)
path = os.path.normpath(original_path)
path = path.replace("/", ".")
path = path.replace("\\", ".")
filename = os.path.splitext(path)[0]
gradio_folder = Path(inspect.getfile(gradio)).parent
message = "Watching:"
message_change_count = 0
watching_dirs = []
if str(gradio_folder).strip():
watching_dirs.append(gradio_folder)
message += f" '{gradio_folder}'"
message_change_count += 1
abs_parent = abs_original_path.parent
if str(abs_parent).strip():
watching_dirs.append(abs_parent)
if message_change_count == 1:
message += ","
message += f" '{abs_parent}'"
print(message + "\n")
# guaranty access to the module of an app
sys.path.insert(0, os.getcwd())
return filename, abs_original_path, [str(s) for s in watching_dirs], demo_name
def main():
# default execution pattern to start the server and watch changes
filename, path, watch_dirs, demo_name = _setup_config()
args = sys.argv[1:]
extra_args = args[1:] if len(args) == 1 or args[1].startswith("--") else args[2:]
popen = subprocess.Popen(
["python", path] + extra_args,
env=dict(
os.environ,
GRADIO_WATCH_DIRS=",".join(watch_dirs),
GRADIO_WATCH_FILE=filename,
GRADIO_WATCH_DEMO_NAME=demo_name,
),
)
popen.wait()
if __name__ == "__main__":
main()