Pythonの学習が進むと、書いたコードを誰かに見せたくなる瞬間が来ます。ところがターミナルに数字が並ぶだけでは、なかなか伝わりません。
かといって、画面を作るためにHTMLやCSS、JavaScriptまで覚えるのは骨が折れますよね。学習の主役がPythonから離れてしまいます。
そこで名前が挙がるのがStreamlitです。Pythonのコードだけで、ブラウザで動く画面を作れるライブラリになります。
この記事では、Streamlitがどんな道具なのかを、実際に動くコードと一緒に順番にほどいていきます。
Streamlitは、画面づくりを肩代わりしてくれる道具¶
まずは立ち位置をはっきりさせておきましょう。Streamlitは、ふつうのPythonスクリプトをそのままブラウザ上のアプリに変えるためのライブラリです。
一般的なWebアプリでは、サーバー側の処理と画面側の見た目を別々に書きます。HTMLで骨組みを組み、CSSで色や余白を整え、ボタンを押したときの動きをJavaScriptで書く、という分担です。
Streamlitは、その分担ごと引き受けてくれます。Pythonのコードだけで画面が作れる、これがいちばんの特徴です。
文字を出したいときは st.write() と書きます。つまみを動かす部品が欲しければ st.slider() と書く。それだけで、ブラウザに部品が現れます。
とくに得意なのは、データを見せる画面です。集計結果を表やグラフにして、条件を変えながら眺める、といった用途で力を発揮します。
まずは最小のアプリを動かしてみる¶
説明を読むより、手を動かしたほうが早いはずです。ここから実際に立ち上げるところまで進みます。
インストールとPythonのバージョン¶
Streamlitは標準ライブラリではないので、pipで入れるところから始めます。プロジェクトごとに仮想環境を作ってから入れると、あとで散らかりません。
pip install streamlit
執筆時点の最新版は1.62.0で、2026年8月19日に公開されています。動かすにはPython 3.10以降が必要で、3.14まで対応が明示されています。
古いPythonのままだと、この時点で止まります。仮想環境の作り方に不安があれば、先に土台を固めておくと安心です。【関連記事】Pythonの仮想環境(venv)って何のためにある?プロジェクトごとに混ぜない管理法
streamlit run で立ち上げる¶
準備ができたら、app.py という名前でファイルを作ります。中身は数行で構いません。
import streamlit as st
st.title("はじめてのStreamlit")
st.write("この文字が見えたら成功です。")
保存したら、ターミナルで次のコマンドを打ちます。python app.py ではない点に注意してください。
streamlit run app.py
しばらくするとブラウザが自動で開き、さきほどの文字が表示されます。これで、あなたのWebアプリが1本動いたことになります。
慣例として import streamlit as st と短い名前を付けて読み込みます。公式のドキュメントもサンプルも、ほぼすべてこの形なので、そろえておくと読むときに迷いません。
画面を触るたび、スクリプトは上から動き直す¶
ここがStreamlitのいちばん独特な部分で、最初につまずきやすいところでもあります。落ち着いて読んでみてください。
Streamlitは、利用者がボタンを押したりスライダーを動かしたりするたびに、スクリプトを先頭から最後まで実行し直します。しかも、まっさらな状態からのやり直しです。
つまり画面の更新は、部分的な書き換えではありません。画面を触るたびにスクリプトが最初から動き直す、この一点さえ飲み込めば、あとの挙動はすべて説明がつきます。
イベントごとに処理を登録していく作り方に慣れていると、最初は奇妙に感じるはずです。ただ、上から下へ読めばそのまま画面になるので、書く側はとても素直になります。
この性質から、注意点がふたつ生まれます。ひとつは変数が毎回リセットされること、もうひとつは重い処理が毎回走ってしまうことです。
どちらにもちゃんと逃げ道が用意されています。次の章で順番に見ていきましょう。
入力を受け取るウィジェットの書き方¶
画面から値を受け取る部品を、Streamlitではウィジェットと呼びます。使い方は驚くほど単純で、関数の戻り値がそのまま入力値になります。
よく使うものを、用途と一緒に並べておきます。
| 書き方 | 画面に出るもの | 戻ってくる値 |
|---|---|---|
st.slider("年齢", 0, 100) |
つまみ付きの目盛り | 選ばれた数値 |
st.text_input("名前") |
1行の入力欄 | 入力された文字列 |
st.selectbox("職種", ["営業", "開発"]) |
選択肢のリスト | 選ばれた項目 |
st.checkbox("詳細を表示") |
チェックボックス | True か False |
st.file_uploader("CSVを選ぶ") |
ファイル選択欄 | 読み込めるファイル |
実際に組み合わせてみます。スライダーで選んだ数だけ、表とグラフを出すだけの短いアプリです。
import pandas as pd
import streamlit as st
st.title("売上ダッシュボード")
rows = st.slider("表示する日数", 1, 30, 7)
df = pd.DataFrame({
"日付": pd.date_range("2026-08-01", periods=rows),
"売上": [1000 + i * 120 for i in range(rows)],
})
st.dataframe(df)
st.line_chart(df, x="日付", y="売上")
つまみを動かすと、表とグラフが同時に変わります。ここまでで15行ほどしか書いていません。
表計算ソフトで似たことをした経験があれば、感覚は近いはずです。違うのは、集計の中身をPythonで自由に書けることです。
st.dataframe() に渡しているのはpandasのデータフレームです。データを加工する側の話は、こちらで基礎から扱っています。【関連記事】pandas入門 データ処理をやってみよう
グラフをもっと細かく作り込みたくなったら、matplotlibで描いた図をそのまま渡すこともできます。【関連記事】Pythonのmatplotlibとは?データをグラフにして見せる基本を初心者向けに解説
詰まらないために覚えたい、ふたつの仕組み¶
さきほど触れた注意点の解決策が、ここで出てきます。どちらも数行で済むので、身構えなくて大丈夫です。
st.session_state で値を持ち越す¶
まっさらな状態から実行し直されるということは、ふつうの変数は毎回ゼロに戻るということです。カウンターを作ろうとして、いつまでも1のまま増えない、という失敗はここから生まれます。
そこで使うのが st.session_state です。辞書のように値を入れておける入れ物で、再実行をまたいでも中身が残ります。
import streamlit as st
if "count" not in st.session_state:
st.session_state.count = 0
if st.button("カウントアップ"):
st.session_state.count += 1
st.write("いまの回数:", st.session_state.count)
最初の3行が肝心です。まだ入れ物が空のときだけ初期値を置く、と書いておかないと、毎回0に戻ってしまいます。
値を持ち越したいときは st.session_state、と覚えておけば十分です。この入れ物は利用者ごとに分かれているので、他の人の画面と混ざる心配もありません。
キャッシュで重い処理を一度だけにする¶
もうひとつの問題が、毎回走ってしまう重い処理です。大きなCSVの読み込みや外部APIの呼び出しが先頭にあると、つまみを動かすたびに待たされます。
Streamlitには、結果を覚えておくための飾りが用意されています。関数の上に1行足すだけです。
import pandas as pd
import streamlit as st
@st.cache_data
def load_data(path):
return pd.read_csv(path)
df = load_data("sales.csv")
st.dataframe(df)
こう書くと、同じ引数で呼ばれたときは前回の結果をそのまま返してくれます。読み込みは実質1回だけになり、画面の反応が見違えます。
似た名前で st.cache_resource もあります。使い分けの目安は、返ってくるものがデータか、それとも使い回す部品かです。
公式ドキュメントの説明を整理すると、次のようになります。迷ったら st.cache_data から始めるのが推奨とされています。
| 飾り | 向いているもの | 返り方 |
|---|---|---|
@st.cache_data |
データフレーム、辞書、リスト、検索結果 | コピーが返る |
@st.cache_resource |
機械学習モデル、DB接続、APIクライアント | 現物が共有される |
重い処理には必ずキャッシュ、これはStreamlitを実務で使うときの前提だと思っておいてください。
FlaskやFastAPIとの使い分け¶
PythonでWebといえばFlaskやFastAPIの名前も挙がります。どれを選べばいいのか、迷うところですよね。
答えは、作りたいものの形で決まります。三つの立ち位置を並べてみます。
| 道具 | 向いている用途 | 画面の作り方 |
|---|---|---|
| Streamlit | 分析結果や社内向けツールの画面 | Pythonだけで完結する |
| Flask | 自由に作り込むWebサイト | HTMLのテンプレートを書く |
| FastAPI | 他のプログラムから呼ぶAPI | 画面は基本的に作らない |
Streamlitは自由度を捨てる代わりに、速さを買う道具です。細かいデザインの調整には向きませんが、思いついた分析をその日のうちに画面にできます。
きちんとしたサイトを作りたくなったら、Flaskに進むのが自然な流れです。【関連記事】PythonのFlaskとは?WebアプリをPythonで動かす仕組みを初心者向けに解説
画面ではなくデータの受け渡しが目的なら、FastAPIが素直です。【関連記事】PythonのFastAPIとは?型ヒントだけで動くWeb APIの作り方をFlaskと比べながら初心者向けに解説
つまずきやすいところと、私の失敗¶
最後に、実際に触ると出会いやすい落とし穴をまとめておきます。先に知っておくと、無駄に悩まずに済みます。
まず、自分のファイルに streamlit.py という名前を付けないでください。本物のライブラリではなく自分のファイルが読み込まれ、原因の分かりにくいエラーになります。
次に、python app.py で起動しないことです。エラーにはならず、何も起きないまま終わるので、かえって混乱します。
ボタンの扱いにも癖があります。ボタンが押された状態は次の再実行まで残らないので、押した結果を保持したいときは st.session_state と組み合わせる必要があります。
私は10年ほどエンジニアとして開発に関わってきましたが、この手軽さで一度ひやりとしたことがあります。社内の集計アプリを軽い気持ちで外部のホスティングに置いたところ、URLを知っていれば誰でも中身が見られる状態になっていました。
数分で公開できるということは、数分で漏らせるということでもあります。公開するなら認証と秘密情報の扱いを先に決める、これは作り始める前に確認すべきでした。
もうひとつの失敗は、キャッシュを付けずに社内へ配ってしまったことです。数十メガのCSVを毎回読み直すアプリになり、遅いという声がすぐに届きました。
まとめ¶
Streamlitは、Pythonのコードだけでブラウザに画面を出せるライブラリです。分析の結果を人に見せるまでの距離が、はっきり縮まります。
覚えることは多くありません。st.write() で表示し、ウィジェットで値を受け取り、streamlit run で起動する。この三つで、ひととおり形になります。
そのうえで、画面を触るたびに上から動き直すという仕組みだけは押さえておいてください。値を残したいなら st.session_state、重い処理にはキャッシュ、と対応が決まります。
まずは1ファイル、10行から始めてみましょう。手元のCSVを読み込んで表に出すだけでも、Pythonが急に人に見せられるものへ変わる感覚が味わえるはずです。
ここまでお読みいただきありがとうございました。