stliteとは
StreamlitはPython環境上で実行されているサーバにブラウザでアクセスする仕組みですが、このサーバを同じブラウザ上で動くようにしたものがstliteです。
Streamlit Creator1であるWhitphxさんが開発しています。
PythonをWebAssembly(WASM)に移植してブラウザ上で動くようにしたPyodideというPythonディストリビューションがあり、stliteはStreamlitをこのPyodideで動くようにすることでサーバレスを実現しているそうです2。
ちょっとした可視化アプリを配布したい場合やWebページにStreamlitのプレイグラウンドを組み込みたい場合に便利そうですね。
例えばElectronと組み合わせればデスクトップで動くStreamlitアプリも実現できるそうです!
使い方
以下のようなコードを書いたHTMLファイルをローカルフォルダに保存します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<title>stlite app</title>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@stlite/mountable@0.58.3/build/stlite.css"
/>
</head>
<body>
<div id="root"></div>
<script src="https://cdn.jsdelivr.net/npm/@stlite/mountable@0.58.3/build/stlite.js"></script>
<script>
stlite.mount(
{
requirements: ["pandas", "numpy"],
entrypoint: "streamlit_app.py",
files: {
"streamlit_app.py": `
import streamlit as st
import pandas as pd
import numpy as np
st.title('Streamlit example')
rnd_data = pd.DataFrame(np.random.randn(50, 3), columns=["A", "B", "C"])
st.line_chart(rnd_data)
`,
},
},
document.getElementById("root")
);
</script>
</body>
</html>
おもむろにブラウザで開くと…Streamlitが動いたァァァァァァ!
ローカルフォルダから開いているのに動くのはちょっとビックリしません?
コードの補足
見たらだいたいわかる!ってくらいに簡単なんですが少しだけ補足を。
バージョン
以下に含まれる0.58.3
の部分については最新のバージョン(あるいは自分の使いたいバージョン)を指定しましょう。
href="https://cdn.jsdelivr.net/npm/@stlite/mountable@0.58.3/build/stlite.css"
src="https://cdn.jsdelivr.net/npm/@stlite/mountable@0.58.3/build/stlite.js"
GitHubのReleasesに最新のバージョンが記載されています。2
パッケージ
パッケージを導入したい場合はstlite.mount
関数に渡すオブジェクトのrequirements
キーに指定してあげればOKです。
今回はPandasとNumPyを導入しています。
requirements: ["pandas", "numpy"],
filesとentrypoint
stlite.mount
関数に渡すオブジェクトのfiles
キーにファイル名とその中身のセットを列挙してあげることで、ブラウザ上のPythonが認識できるファイル一覧を定義することができます。
今回はstreamlit_app.py
というPythonファイルのみを渡しています。
entrypoint: "streamlit_app.py",
files: {
"streamlit_app.py": `
import streamlit as st
import pandas as pd
import numpy as np
st.title('Streamlit example')
rnd_data = pd.DataFrame(np.random.randn(50, 3), columns=["A", "B", "C"])
st.line_chart(rnd_data)
`,
また、stliteはentrypoint
キーに指定されたファイル名を使ってstreamlit run
コマンドを実行します。
今回はfiles
で渡したstreamlit_app.py
をそのままStreamlitアプリとして起動しているので、streamlit_app.py
の中身である「 ` 」で囲まれている部分、すなわち
import streamlit as st
import pandas as pd
import numpy as np
st.title('Streamlit example')
rnd_data = pd.DataFrame(np.random.randn(50, 3), columns=["A", "B", "C"])
st.line_chart(rnd_data)
にはStreamlitアプリとして動作するPythonコードを記載してあげましょう。
Streamlitアプリがマウントされる場所
stlite.mount
関数に渡す要素の中にStreamlitアプリがマウントされます。
今回はIDがroot
の要素にStreamlitアプリをマウントしています。
document.getElementById("root")
-
Streamlitコミュニティへの貢献が世界トップクラスな方々のこと。https://streamlit.io/creators ↩