-
-
Save tvst/ef477845ac86962fa4c92ec6a72bb5bd to your computer and use it in GitHub Desktop.
from streamlit.ScriptRequestQueue import RerunData | |
from streamlit.ScriptRunner import RerunException | |
from streamlit.server.Server import Server | |
import streamlit.ReportThread as ReportThread | |
def rerun(): | |
"""Rerun a Streamlit app from the top!""" | |
widget_states = _get_widget_states() | |
raise RerunException(RerunData(widget_states)) | |
def _get_widget_states(): | |
# Hack to get the session object from Streamlit. | |
ctx = ReportThread.get_report_ctx() | |
session = None | |
session_infos = Server.get_current()._session_infos.values() | |
for session_info in session_infos: | |
if session_info.session._main_dg == ctx.main_dg: | |
session = session_info.session | |
if session is None: | |
raise RuntimeError( | |
"Oh noes. Couldn't get your Streamlit Session object" | |
'Are you doing something fancy with threads?') | |
# Got the session object! | |
return session._widget_states |
Thanks for sharing this!
It does trigger a rerun of the script,
However I found that all values are reset to their default values and are not reflecting the state of the UI.
example:
if the code has gui_pipeline_debug = st.sidebar.checkbox("Debug", value=False)
and when I check it, then gui_pipeline_debug is True,
But if a rerun is called later, on the next run, gui_pipeline_debug is now False although the checkbox is still ticked on the web page.
Am I doing something wrong, or is there a way to fix this?
Thanks
I updated the gist to work with the more recent streamlit versions 0.54.0 and upwards. The fork can be found here!
Script won't work for 0.57.3, fixed version: https://gist.github.com/goraj/47f4e365a13b11c4c0eba4f233acda76
I get RecursionErrors after about a 1000 reruns. Must be because of the nested raised RerunExceptions.
I think it can be fixed using session.request_rerun()
"Oh noes..." 🤣