Streamlit调用Click命令报错SystemExit:0,为何终端运行正常?
问题原因
@click.command装饰器会把目标函数包装成命令行专用的执行入口,当你直接调用包装后的函数时,它处理完参数后会自动执行sys.exit(0)终止进程。- 终端环境里进程执行完退出是正常操作,但Streamlit是持续运行的Web应用,进程被强制退出就会抛出
SystemExit: 0错误。 - 另外原代码用
print输出的内容只会出现在Streamlit的后台终端,不会显示在Web页面上,而且st.header接收的是函数返回值(click命令函数默认返回None),根本达不到你要在页面展示内容的目的。
解决方案
有两种实用的处理方式:
方式1:直接调用原始函数(绕过click的命令行包装)
既然你的函数核心逻辑就是接收rating和like参数生成内容,直接传参调用就行,不用走命令行参数解析:
import streamlit as st import click st.header("hi") @click.command() @click.option("--rating", type=int, default=5, help="The rating of the movie") @click.argument("like") def show_rating(rating, like): return f"The movie has a rating of {rating}\nThe movie is likeable: {like}" # 直接传参数调用,拿到结果后展示 result = show_rating(rating=8, like="True") st.header(result)
方式2:用click的invoke方法执行(避免进程退出)
如果必须保留命令行参数解析的逻辑,可以通过click命令对象的invoke方法执行,这样不会触发进程退出:
import streamlit as st import click st.header("hi") @click.command() @click.option("--rating", type=int, default=5, help="The rating of the movie") @click.argument("like") def show_rating(rating, like): return f"The movie has a rating of {rating}\nThe movie is likeable: {like}" # 创建上下文,调用invoke执行命令 ctx = click.Context(show_rating) result = ctx.invoke(show_rating, like="True", rating=8) # 也可以用命令行参数格式解析: # result = ctx.invoke(show_rating, *click.parse_args(["True", "--rating", "8"])) st.header(result)
补充提醒
- 不管用哪种方式,都要把函数里的
print改成return,这样才能把内容传给st.header在Web页面展示。 - click本来就是为命令行工具设计的,在Streamlit这类Web应用里,如果不需要命令行交互,直接调用函数逻辑会更简单。
内容的提问来源于stack exchange,提问作者juco
相关产品推荐
相关产品推荐

