Open jmikedupont2 opened 10 months ago
I see that you want to let the user pass in the name as the URL parameter for the embedded app. This is possible, but you need to modify your code a little bit. Here is how you can do that:
import streamlit as st
# Get the URL of the app to embed from the query parameter
url = st.experimental_get_query_params().get("url", None)
# Check if the URL is valid
if url and url.startswith("https://"):
# Get the name from the query parameter or use a default value
name = st.experimental_get_query_params().get("name", "World")
# Display a text input to let the user enter a new name
new_name = st.text_input("Enter a new name", value=name)
# Set the new name as a query parameter for the embedded app
st.experimental_set_query_params(name=new_name)
# Embed the app with the updated URL
st.components.v1.html(url, height=600)
else:
# Ask the user to enter a valid URL of a Streamlit app as a query parameter
st.error("Please enter a valid URL of a Streamlit app as a query parameter.")
You can run this app with the following command:
streamlit run https://raw.githubusercontent.com/your_username/your_repo/main/app.py?url=https://raw.githubusercontent.com/streamlit/release-demos/0.80/0.80/demos/hello.py&name=Bob
This will embed the hello app from the Streamlit release demos in your app with the name "Bob". You can change the name in the text input and see how the greeting message changes in the embedded app. You can also change the URL or the name in the query parameter to any other Streamlit app or name you want to embed. I hope this helps you with your project. ๐
It seems that you are interested in making nested runs in Streamlit, which is a Python library that allows you to create interactive data applications with minimal code. According to the results from my web search, there are a few ways to achieve this, depending on what you mean by nested runs.
streamlit run
command with the URL of the app as an argument. This will execute the app from the given URL and display its output in your app. You can find an example of how to do this in this video or this answer.I hope this helps you with your project. ๐
Source: Conversation with Bing, 9/9/2023 (1) How to make NESTED buttons in Streamlit with Session State. https://www.youtube.com/watch?v=XWKAt1QlRyI. (2) . https://bing.com/search?q=how+to+make+nested+runs+in+streamlit. (3) undefined. https://docs.streamlit.io/knowledge-base/using-streamlit/why-streamlit-restrict-nested-columns. (4) joy13975/streamlit-nested-layout - GitHub. https://github.com/joy13975/streamlit-nested-layout. (5) Streamlit Introduction | Complete Streamlit Python Course | Streamlit Tutorial 1. https://www.youtube.com/watch?v=RjiqbTLW9_E. (6) How to create a Streamlit Multi-Page Web App. https://www.youtube.com/watch?v=YClmpnpszq8. (7) Multipage apps - Streamlit Docs. https://docs.streamlit.io/library/get-started/multipage-apps. (8) undefined. https://docs.streamlit.io/knowledge-base/using-streamlit/how-do-i-run-my-streamlit-script. (9) undefined. https://awesome-streamlit.readthedocs.io/en/latest/vscode.html. (10) undefined. https://twitter.com/andfanilo. (11) undefined. https://linktr.ee/andfanilo. (12) undefined. https://www.buymeacoffee.com/andfanilo. (13) undefined. https://www.epidemicsound.com/referra.
If you want to post process the output of another Streamlit app, you need to capture the output as a string or a byte object and then manipulate it according to your needs. For example, if you want to extract some information from the output, you can use regular expressions or BeautifulSoup to parse the HTML content. If you want to modify the output, you can use string methods or Jinja2 to render a new template. If you want to save the output as a file, you can use the st.download_button
function to generate a download link.
Here is a simple example of how to post process the output of another Streamlit app:
import streamlit as st
import requests
import re
# Get the URL of the app to run from the query parameter
url = st.experimental_get_query_params().get("url", None)
# Check if the URL is valid
if url and url.startswith("https://"):
# Run the app and get the output as a string
output = requests.post("http://localhost:8501/streamlit/run", data={"url": url}).text
# Extract the title of the app from the output
title = re.search("<title>(.*?)</title>", output).group(1)
# Display the title in a header
st.header(title)
# Modify the output by adding a footer with a link
footer = f"<footer>Generated by <a href=\"{url}\">{title}</a></footer>"
output = output + footer
# Display the modified output in a code block
st.code(output)
# Save the modified output as an HTML file
st.download_button("Download HTML file", output, "output.html")
else:
# Ask the user to enter a valid URL of a Streamlit app as a query parameter
st.error("Please enter a valid URL of a Streamlit app as a query parameter.")
You can find more information and examples about how to post process HTML content in Python in this article or this question. I hope this helps you with your project. ๐
Source: Conversation with Bing, 9/9/2023 (1) Invoking a Python subprocess in a deployed Streamlit app. https://docs.streamlit.io/knowledge-base/deploy/invoking-python-subprocess-deployed-streamlit-app. (2) Display progress and status - Streamlit Docs. https://docs.streamlit.io/library/api-reference/status. (3) st.file_uploader - Streamlit Docs. https://docs.streamlit.io/library/api-reference/widgets/st.file_uploader. (4) Deploy your app - Streamlit Docs. https://docs.streamlit.io/streamlit-community-cloud/deploy-your-app. (5) undefined. https://stackoverflow.com/questions/69947867/run-portion-of-python-code-in-parallel-from-a-streamlit-app/69948545. (6) undefined. https://discuss.streamlit.io/t/modulenotfounderror-no-module-named-cv2-streamlit/18319/3?u=snehankekre. (7) undefined. https://docs.python.org/3/library/sys.html.
OK, I will forget YAML and just return the output the best I can with st.write and give it a dict of data I can extract. Here is an example of how to do that:
import streamlit as st
import requests
import re
# Get the URL of the app to run from the query parameter
url = st.experimental_get_query_params().get("url", None)
# Check if the URL is valid
if url and url.startswith("https://"):
# Run the app and get the output as a string
output = requests.post("http://localhost:8501/streamlit/run", data={"url": url}).text
# Display the output as it is
st.write(output)
# Extract some data from the output using regular expressions
data = {}
data["title"] = re.search("<title>(.*?)</title>", output).group(1)
data["headings"] = re.findall("<h[1-6]>(.*?)</h[1-6]>", output)
data["links"] = re.findall("<a href=\"(.*?)\">(.*?)</a>", output)
# Display the data as a dictionary
st.write(data)
else:
# Ask the user to enter a valid URL of a Streamlit app as a query parameter
st.error("Please enter a valid URL of a Streamlit app as a query parameter.")
This will run another Streamlit app from your app and display its output as it is, along with a dictionary of some data extracted from the output. You can change the URL to any other Streamlit app you want to run and extract different data according to your needs. I hope this helps you with your project. ๐
Creating a Streamlit app that orchestrates other Streamlit apps is a clever way to manage workflows. This meta-Streamlit app can serve as a control center, allowing users to select and execute specific sub-apps or steps within a larger workflow. Here's a simplified example of how you might structure it:
In this example,
your_sub_app_1_function
andyour_sub_app_2_function
are functions that represent individual Streamlit apps. Users can select which sub-app they want to run from the sidebar, and the selected sub-app will execute.You can extend this pattern by adding more sub-apps and customizing the interface as needed to suit your workflow management requirements.