1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberryでstreamlitを勉強してみる①

Last updated at Posted at 2024-10-07

streamlitとは? (個人見解)
Web開発の経験がなくても、Pythonを知っていれば、Webサイトが作れるツール。
(コレ ↑ が、大きなメリットと思います。フロント技術は標準で充実しています)
では、デメリットを考えると…
 ・多要素認証のような複雑な仕組みを作るのには不向きな感じ。
 ・JavaScriptやCSSが使えない事による弊害 = 凝った画面は作れない等
 ・あらゆる処理がサーバサイドに寄る = 1つ1つの画面操作の動作が重い感じ
以上から、同時アクセスが集中しない簡易使い方であれば、アリな気がします。
(特にプロトタイプや営業活動等の見せる部分では、有効な手法と感じました)
※実際に実装してみましょう・・・

フォルダやファイルの構成
拡張性を意識して、少しプログラムを分割したサンプルを用意しています。

構成
└── test
    ├── venv (仮想用フォルダ)
    ├── main.py (Streamlitを起動するファイル)
    ├── sidebar.py (画面横のメニュー欄)
    ├── graph1.py (折れ線グラフ)
    └── graph2.py (散布図)

準備作業
sudo mkdir /test (作業フォルダ作成)
cd /test (カレント移動)
sudo python3 -m venv venv (仮想環境の構築)
sudo chmod 777 -R /test (権限をゆるく設定)
source /test/venv/bin/activate (仮想環境の立ち上げ)
pip3 install streamlit

main.py (streamlitで起動するプログラム)
import streamlit as st
from sidebar import sidebar_process
from graph1 import show_graph as gra1
from graph2 import show_graph as gra2
if __name__ == "__main__":
    gra, val = sidebar_process()
    if gra == "折れ線":
        gra1(val)
    else:
        gra2(val)
sidebar.py (サイドバーメニュー)
import streamlit as st
def sidebar_process():
    opt1 = ["折れ線", "散布図"]
    graf = st.sidebar.selectbox("グラフ選択", opt1)
    opt2 = ["いろは", "かき"]
    valu = st.sidebar.selectbox("値選択", opt2)
    return graf, valu
graph1.py (折れ線グラフ)
import streamlit as st
import pandas as pd
import numpy as np
def show_graph(val):
    if val == "いろは":
        chart_data = pd.DataFrame(np.random.randn(50, 3), columns=["", "", ""])
    else:
        chart_data = pd.DataFrame(np.random.randn(50, 2), columns=["", ""])
    st.line_chart(chart_data)
graph2.py (散布図)
import streamlit as st
import pandas as pd
import numpy as np
def show_graph(val):
    data = pd.DataFrame({
        'weight': np.random.normal(50, 20, 30),
        'height': np.random.normal(50, 20, 30)
    })
    if val == "いろは":
        data['class'] = np.random.choice(['','',''], 30)
    else:
        data['class'] = np.random.choice(['',''], 30)
    st.scatter_chart(data, x='weight', y='height', color='class')    

テストしてみる
(仮想環境のまま)streamlit run main.py (streamlitが実行されます)
その後、パソコンより「http://(RaspberryのIPアドレス):8501」へアクセスします。
streamlitらしい画面が表示されますよね?
Ctrl+C キーで、streamlitを停止します。
deactivate (仮想を終了します)

streamlitをサービス起動する方法
Apacheを使うと、そのままサービス起動するようになるのですが、streamlitの場合、systemdにてサービス登録する事で、電源を入れた時に自動起動させる事が可能です。
sudo vi /etc/systemd/system/streamlit_service.service

streamlit_service.service
[Unit]
Description=Streamlit Service
After=network.target

[Service]
WorkingDirectory=/test
Environment=PATH=/test/venv/bin:$PATH
ExecStart=/test/venv/bin/streamlit run /test/main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl start streamlit_service
この後、パソコンより「http://(RaspberryのIPアドレス):8501」へアクセスします。
streamlitの画面が表示されますよね?
sudo systemctl enable streamlit_service (サービス起動として登録)
sudo reboot (raspberryを再起動)
この後、パソコンより「http://(RaspberryのIPアドレス):8501」へアクセスします。
streamlitの画面が表示されますよね?
これでサービス登録も終了です。 お疲れさまでした~

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?