如何在python中使用streamlit处理导入错误

How to handle import error with streamlit in python

提问人:MAC 提问时间:7/13/2023 更新时间:7/13/2023 访问量:300

问:

我正在尝试在UI上打印自定义错误消息,以防出现导入错误。streamlit

下面是一个简单的代码:

import streamlit as st
try:
    from google.auth import default
    from google.cloud import bigquery
except ImportError:
    st.write("Reauthentication is needed.")
    st.stop()


import pandas as pd
import base64



st.set_page_config(layout="wide")
pd.set_option('display.max_columns', None)
credentials, project_id = default()
client = bigquery.Client(credentials=credentials, project="project")
st.title('Tool')
st.write('Provide the ID')
_options = ['1', '2', '3']
default_client = "1"

with st.sidebar:
    _id = st.text_input("ID:","jhjkdkjhhkjhkj")

行中存在错误,但是当我使用它启动 streamlit 时,它会运行整个代码并在 UI 中抛出 Tracebackfrom google.auth import defaultstreamlit run app.py

如何确保 streamlit 应用程序在看到错误后立即停止,而无需运行整个扫描并在 UI 上显示自定义错误消息?app.py

python-3.x 错误处理 streamlit

评论


答:

0赞 matleg 7/13/2023 #1

您是否保存了文件和/或重新运行? 因为我运行了你的代码,我认为它完全符合你的预期。没有错误堆栈,页面仅显示:enter image description here

编辑: 在评论之后,这是我用来运行 streamlit 并杀死它的脚本的一部分:

#!/usr/bin/env bash

script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)

echo "Script dir: ${script_dir}"

# streamlit rerun also reload imports in PYTHONPATH in case of modification
# : "${PYTHONPATH=${script_dir}/..:${script_dir}/../src:${script_dir}/../detr}"
: "${PYTHONPATH=${script_dir}/..}"

export PYTHONPATH="${PYTHONPATH}"
export CUDA_VISIBLE_DEVICES=""
export CUDA_LAUNCH_BLOCKING=1

echo "PYTHONPATH: ${PYTHONPATH}"
if [ -f "${script_dir}/streamlit.log" ]; then
    echo "Removing previous file streamlit.log"
    rm "${script_dir}/streamlit.log"
fi

echo "Starting streamlit in 5s, [Ctrl + c] to abort ..."
sleep 2
echo "3s ..."
sleep 2
echo "1s ..."
sleep 1
echo "Running 'streamlit run ${script_dir}/demo_tt.py'"
echo "Please wait..."

nohup streamlit run "${script_dir}/demo_tt.py" >"${script_dir}/streamlit.log" 2>&1 &
echo $! >"${script_dir}/streamlit.pid"

while ! [ -s "${script_dir}/streamlit.log" ]; do
    sleep 1
done

cat "${script_dir}/streamlit.log"
echo "To follow logs :"
echo "tail -f ${script_dir}/streamlit.log"

并杀死它:

#!/usr/bin/env bash

script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)

PID_FILE="${script_dir}/streamlit.pid"

if [ -f "${PID_FILE}" ]; then
    echo "Killing streamlit based on pid file: ${PID_FILE}"
    kill -9 "$(cat "${PID_FILE}")"
    rm "${PID_FILE}"
else
    kill -9 "$(ps aux | grep 'streamlit run' | grep <your_user_name> | grep -v grep | awk '{print $2}')"
fi

所以正如你所看到的,为了回答你的评论,我残酷地杀死了所有包含my_username和“流光运行”的进程。同样,可能不是最佳实践,但它可以完成工作。希望它也能在MAC上运行。

评论

0赞 MAC 7/13/2023
不,它没有给我看。您使用的是哪个版本的 streamlit?另外,如何停止在macbook端口上运行的所有应用程序?
0赞 matleg 7/13/2023
我在 WSL ubuntu 上有 Python3.10,streamlit==1.23.1。没有尝试过,但如果你想立即退出,也许你可以使用 exit(1) 而不是 st.stop()?。否则,就我而言,我使用 shell 脚本运行 streamlit 并保留 PID 以备后用。如果您有兴趣,我会用一些信息编辑我的答案,但这可能不是最佳实践......