前提条件: 本指南要求您了解区块。请确保首先阅读区块指南。
本指南涵盖了自动重新加载、在Python IDE中重新加载以及将gradio与Jupyter Notebooks结合使用。
当你构建一个Gradio演示时,特别是使用Blocks时,你可能会发现不断重新运行代码以测试更改非常麻烦。
为了使编写代码更快、更方便,我们使得在Python IDE(如VS Code、Sublime Text、PyCharm等)中开发时或通常从终端运行Python代码时,能够更轻松地“重新加载”您的Gradio应用程序。我们还开发了一个类似的“魔法命令”,如果您使用Jupyter Notebooks(或任何类似的环境,如Colab),可以让您更快地重新运行单元格。
本简短指南将涵盖这两种方法,因此无论你如何编写Python,你都将学会如何更快地构建Gradio应用程序。
如果你正在使用Python IDE构建Gradio Blocks,你的代码文件(我们称之为run.py)可能看起来像这样:
import gradio as gr
with gr.Blocks() as demo:
gr.Markdown("# Greetings from Gradio!")
inp = gr.Textbox(placeholder="What is your name?")
out = gr.Textbox()
inp.change(fn=lambda x: f"Welcome, {x}!",
inputs=inp,
outputs=out)
if __name__ == "__main__":
demo.launch()问题在于,每当你想要更改布局、事件或组件时,你必须通过编写python run.py来关闭并重新运行你的应用程序。
与其这样做,你可以通过更改一个词来在重载模式下运行你的代码:将python改为gradio:
在终端中运行 gradio run.py。就这样!
现在,你会看到类似这样的内容:
Watching: '/Users/freddy/sources/gradio/gradio', '/Users/freddy/sources/gradio/demo/'
Running on local URL: http://127.0.0.1:7860这里重要的部分是显示Watching...的那一行。这里发生的是,Gradio将观察run.py文件所在的目录,如果文件发生变化,它将自动为你重新运行该文件。所以你可以专注于编写代码,而你的Gradio演示将自动刷新 🥳
提示: `gradio` 命令不会检测传递给 `launch()` 方法的参数,因为在重新加载模式下 `launch()` 方法从未被调用。例如,在 `launch()` 中设置 `auth` 或 `show_error` 将不会在应用程序中反映出来。
在使用重载模式时,有一件重要的事情需要记住:Gradio 特别会在你的代码中寻找一个名为 demo 的 Gradio Blocks/Interface 演示。如果你给你的演示起了其他名字,你需要在代码中将你的演示名称作为第二个参数传入。所以如果你的 run.py 文件看起来像这样:
import gradio as gr
with gr.Blocks() as my_demo:
gr.Markdown("# Greetings from Gradio!")
inp = gr.Textbox(placeholder="What is your name?")
out = gr.Textbox()
inp.change(fn=lambda x: f"Welcome, {x}!",
inputs=inp,
outputs=out)
if __name__ == "__main__":
my_demo.launch()然后你可以像这样以重载模式启动它:gradio run.py --demo-name=my_demo。
默认情况下,Gradio 使用 UTF-8 编码来处理脚本。对于重新加载模式,如果您使用的是 UTF-8 以外的编码格式(例如 cp1252),请确保您已经这样做了:
# -*- coding: cp1252 -*-gradio run.py --encoding cp1252🔥 如果你的应用程序接受命令行参数,你也可以传递它们。这里有一个例子:
import gradio as gr
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, default="User")
args, unknown = parser.parse_known_args()
with gr.Blocks() as demo:
gr.Markdown(f"# Greetings {args.name}!")
inp = gr.Textbox()
out = gr.Textbox()
inp.change(fn=lambda x: x, inputs=inp, outputs=out)
if __name__ == "__main__":
demo.launch()你可以这样运行:gradio run.py --name Gretel
顺便提一下,如果您更改了run.py源代码或Gradio源代码,这种自动重新加载就会发生。这意味着如果您决定为Gradio本身做出贡献 ✅,这可能会有用。
默认情况下,重新加载模式会在每次更改时重新运行整个脚本。
但在某些情况下,这是不可取的。
例如,加载机器学习模型可能应该只发生一次以节省时间。还有一些使用C或Rust扩展的Python库在重新加载时会抛出错误,比如numpy和tiktoken。
在这些情况下,您可以将不希望重新运行的代码放在if gr.NO_RELOAD:代码块中。以下是一个示例,展示了如何在开发过程中仅加载一次transformers模型。
提示: `gr.NO_RELOAD` 的值为 `True`。因此,当您完成开发并希望在生产环境中运行脚本时,无需更改脚本。只需使用 `python` 而不是 `gradio` 运行文件即可。
import gradio as gr
if gr.NO_RELOAD:
from transformers import pipeline
pipe = pipeline("text-classification", model="cardiffnlp/twitter-roberta-base-sentiment-latest")
demo = gr.Interface(lambda s: pipe(s), gr.Textbox(), gr.Label())
if __name__ == "__main__":
demo.launch()如果你使用Jupyter Notebooks(或Colab Notebooks等)来开发代码呢?我们也有适合你的东西!
我们已经开发了一个魔法命令,它将为您创建并运行一个Blocks演示。要使用此功能,请在您的笔记本顶部加载gradio扩展:
%load_ext gradio
然后,在你正在开发Gradio演示的单元格中,只需在顶部写上魔法命令%%blocks,然后像平常一样编写布局和组件:
%%blocks
import gradio as gr
with gr.Blocks() as demo:
gr.Markdown(f"# Greetings {args.name}!")
inp = gr.Textbox()
out = gr.Textbox()
inp.change(fn=lambda x: x, inputs=inp, outputs=out)请注意:
您不需要启动您的演示 — Gradio 会自动为您完成!
每次重新运行单元格时,Gradio 都会在同一端口上并使用相同的底层 Web 服务器重新渲染您的应用程序。这意味着您将看到您的更改比正常重新运行单元格时快得多。
这是在jupyter笔记本中的样子:

🪄 这也可以在colab笔记本中使用!这是一个colab笔记本,你可以在其中看到Blocks魔法的实际效果。尝试做一些更改并重新运行包含Gradio代码的单元格!
Notebook Magic 现在是作者构建 Gradio 演示的首选方式。无论你如何编写 Python 代码,我们希望这些方法中的任何一种都能为你提供更好的 Gradio 开发体验。
现在你已经知道如何使用Gradio快速开发,开始构建你自己的吧!
如果你正在寻找灵感,可以尝试探索其他人用Gradio构建的演示,浏览公共Hugging Face Spaces 🤗