はじめに
Pythonのライブラリの1つである、WebフレームワークのStreamlitを用いてWebアプリケーションを作成していたところ
「違う機能を持ったStreamlitアプリを使うとき、いちいちアプリを停止して、コマンドたたくの面倒くさいな…」
と感じたことがありました。
Streamlitアプリは「streamlit run 〇〇.py」というコマンドを使用して、アプリを起動しますが、同時に2つのアプリを起動することができません。
違うアプリを使用したいのであれば、一度アプリを閉じ、再度コマンドをたたく必要があるのです。
めんど!!!と思ったので、今回はStreamlitアプリを同時に起動する方法についてまとめたいと思います。
実際にやってみた
今回はsubprocessというライブラリを使用していきます。
subprocessとは、Pythonの標準ライブラリで、外部プロセスを生成したり、制御するために使用されます。つまり、Pythonプログラムから外部プログラムやコマンドを呼び出すことが可能です。
今回の簡単な流れです。
- 必要なライブラリをインポート
- ファイルを読み込むウィジェットを作成し、ファイルを読み込む
- 読み込んだファイルの中身を一時的に保管するファイルにコピー
- subprocessライブラリを使用して、一時的に保存したファイルに対して、指定のコマンドを実行する
それではコードを書いてみましょう。
import streamlit as st
import subprocess
st.title("ファイルを読み込んで実行")
# ファイルを選択するウィジェットを作成
file = st.file_uploader("ファイルを選択してください", type="py")
if st.button("Streamlitアプリを実行") and file is not None:
# 選択されたファイルを一時ファイルとして保存
with open("temp_script.py", "wb") as f:
f.write(file.read())
# subprocessライブラリを使用して、別のPythonスクリプトを実行
subprocess.Popen(["streamlit", "run", "temp_script.py"])
ボタンを押下することで、with構文を使用して読み込んだファイルの中身を一時ファイルとして保存し、同時に指定したコマンドを実行します。
ボタンを用意した理由は、ユーザビリティを高めるためです。
ファイルの読み込みと同時に実行されてしまうと、ユーザーが誤ってファイルを選択してしまった場合でも直ぐに実行してしまいます。面倒ですよね。
ちなみにこのスクリプトもStreamlitアプリとして起動するので、こいつ自体はコマンドを入力して起動しておく必要があります。
まとめ
おかげでいろんな作業を行き来することが可能になりました!
特に意味のあるプログラムかと言われたら、そうでもないような気もしますが、自分の作業効率が少しでも上がったのでヨシとします!
それでは!!!