はじめに
はぁ、かわいい... nikkieです。
久々にStreamlitを触って1気づいた小ネタです。
configuration(設定)、いろいろなやり方をサポートしているんですね!
目次
- はじめに
- 目次
- Streamlitのドキュメント「Configuration」
- 例:browser.gatherUsageStatsを設定する
- 検証:browser.gatherUsageStatsをfalseに設定する
- 終わりに
- P.S. 設定優先順位の動作確認、あれ?
Streamlitのドキュメント「Configuration」
Streamlit provides four different ways to set configuration options.
意訳:Streamlitは、設定オプションをセットするために、4つの異なる方法を提供します
以下の4つが紹介されます。
- global config file(グローバルなconfigファイル)
- per-project config file(プロジェクトごとのconfigファイル)
- 環境変数
streamlit run
の引数
1. global config file
tomlファイルを配置します。
2. per-project config file
global config fileと共通の形式のtomlファイルを$CWD/.streamlit/config.toml
に配置します
例えばstreamlit run app.py
と動かしているなら(app.py
がある現在のディレクトリが$CWD
ですから)
. ├── app.py └── .streamlit/ └── config.toml
という配置になるわけですね。
3. 環境変数
STREAMLIT_*
という命名規則の環境変数でも設定できます!
設定の仕方についてはstreamlit run --help
でenv varとしてどう設定するか教えてもらえます。
4. streamlit run
の引数
streamlit run app.py
に続けても指定できます。
4つの設定の優先順位
This list is in reverse order of precedence, i.e. command line flags take precedence over environment variables when the same configuration option is provided multiple times.
このリストは優先順位の逆順になっています。
すなわち、同一の設定オプションが複数回指定されたとき、コマンドライン引数は環境変数より優先されます。
ここで示した1〜4のうち、数が大きいほど優先されるということですね。
同じ設定値を指定したとき、数が大きい設定方法が優先される✍️
なお、この4通りで設定できるオプションの一覧がView all configuration optionsセクションにあります。
例:browser.gatherUsageStatsを設定する
Configurationのドキュメントの「Telemetry」に記載があります。
Streamlitが使用統計を集めるのをオプトアウトできる設定値です。
最初にstreamlit run app.py
したときにもコマンドラインに表示されますよね2。
You can find our privacy policy at https://streamlit.io/privacy-policy Summary: - This open source library collects usage statistics. - We cannot see and do not store information contained inside Streamlit apps, such as text, charts, images, etc. - Telemetry data is stored in servers in the United States. - If you'd like to opt out, add the following to ~/.streamlit/config.toml, creating that file if necessary: [browser] gatherUsageStats = false
streamlit run --help
の中にもあります。
--browser.gatherUsageStats BOOLEAN Whether to send usage statistics to Streamlit. [env var: STREAMLIT_BROWSER_GATHER_USAGE_STATS]
検証:browser.gatherUsageStatsをfalseに設定する
tomlファイルを使った設定は知っていましたが、環境変数とstreamlit run
の引数による設定は初めて知ったので手を動かして検証しました。
Dockerコンテナでアプリを動かし、起動時のログからfalseに設定できているかを判断しています。
(2023/05/11 追記)
「起動時のログからfalseに設定できているかを判断」、これは筋が悪くP.S.にあるような混乱を招きました。
config.get_option("browser.gatherUsageStats")
を確認するバージョンで近く更新します
(追記終わり)
(2023/05/16 追記)
config.get_option
を使ってリベンジした確認はこちらです。
本記事の検証部分は非推奨です。ぜひリベンジにお進みください
(追記終わり)
検証用アプリ
Streamlitアプリとしては何もしません。
import streamlit as st st.title("Awesome app!")
Dockerfileはこちら
docker build -t practice_streamlit .
「Streamlit, version 1.22.0」がインストールされたイメージができました。
このコンテナを起動すると、
docker run --rm -it -p 8501:8501 practice_streamlit
使用統計の収集をオプトアウトしていないので、以下のメッセージが表示されます。
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.
(なお、http://127.0.0.1:8501/ にアクセスすると、アプリが動いていることが確認できます)
環境変数STREAMLIT_BROWSER_GATHER_USAGE_STATS
による設定
docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=false -p 8501:8501 practice_streamlit
-e
オプションで環境変数を指定しました。
このとき、「Collecting usage statistics.」は表示されません。
表示されていないのでdeactivateされたと理解しています。
streamlit run
の引数--browser.gatherUsageStats
による設定
DockerfileでCMD
命令を使っているので、外から上書きが可能です。
CMDと同様の命令を外から渡してみます。
docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.
使用統計の収集をオプトアウトしていない状態ですね。
--browser.gatherUsageStats
を渡してみましょう。
docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats false
「Collecting usage statistics.」は表示されなくなりました!
終わりに
Streamlit、tomlファイルや環境変数、streamlit run
の引数と、4通りで設定できます!
- tomlファイル
- グローバルに置く、または、プロジェクトごとに置く
- 環境変数
STREAMLIT_
で始まる- 単語ごとに
_
で区切られる規則に従う(例:STREAMLIT_BROWSER_GATHER_USAGE_STATS
) streamlit run --help
でenv varも確認できる
streamlit run
の引数--<tomlの[]>.<[]の下の設定値>
という形式(例:--browser.gatherUsageStats
)streamlit run --help
で確認できる
- 優先順位は
streamlit run
の引数 > 環境変数 > プロジェクトごとのtomlファイル > グローバルのtomlファイル
環境変数で設定できるのはいいですね〜。
Dockerコンテナとして動かすとき、DockerfileにENVを1行書いておくだけで設定できるのが個人的に好みです。
「Dockerコンテナの中にtomlファイルを置くの、やってもいいけどあんまり気が進まないな〜」と感じましたが、環境変数で行数少なく解決できました🙌
P.S. 設定優先順位の動作確認、あれ?
宿題事項です。なにか間違えているように思います
環境変数よりstreamlit run
の引数が優先なので
- (A) 環境変数でgatherUsageStats=false、
streamlit run
の引数でtrue 👉streamlit run
の引数優先でtrueになるはず - (B) 環境変数でgatherUsageStats=true、
streamlit run
の引数でfalse 👉streamlit run
の引数優先でfalseになるはず
(A)の検証
docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=false -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats true
「Collecting usage statistics.」は表示されません、あれ?(表示されると期待していた)
(B)の検証
docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=true -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats false
「Collecting usage statistics.」は表示されません
また、STREAMLIT_BROWSER_GATHER_USAGE_STATS
の指定をtrue
にしたとき「Collecting usage statistics.」が表示されません(オプトアウトしていない設定なので表示されると期待していた)。
docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=true -p 8501:8501 practice_streamlit
3
ソースコード見てみよう(宿題。この設定だけトクベツなのかな?)
- 2020年 2021年 アーカイブ https://www.youtube.com/live/rrRB2FeEqEU?feature=share↩
- https://github.com/streamlit/streamlit/blob/1.22.0/lib/streamlit/runtime/credentials.py#L77-L93↩
-
docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats true
でも「Collecting usage statistics.」が表示されないですね↩