質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3652閲覧

python streamlit ネットワークフォルダのリンクをローカル作成したい

matsutai

総合スコア53

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

3クリップ

投稿2023/01/12 02:03

実現したいこと

streamlitを使って、ローカルネットワーク内で、Webサービスを公開しようとしております。
使い方としては、
ローカルネットワーク上のPCで、WebサービスをStreamlitを作成して立ち上げる。Streamlitを実行した際に出てくる標準出力に書かれてあるNetwork URLをにWebブラウザでアクセスしてもらいます。環境構築PCはWebサービスを立ち上げるPCのみです。

Webサービスの機能として、エクセルファイル作成して、ネットワーク上のフォルダに保存する仕様にしていますが、下記のようなリンク機能を実装したいのですがうまくいきません。
・上記のネットワーク上の保存フォルダを、使用者のPC上で開いて保存ファイルを取りに行けるためのボタン等を作りたい
もしくは、
・上記のネットワーク上に保存したエクセルファイルを、使用者のPC上で直接開きたい

subprosess.Popen のコマンドを使えば、ローカルPC上では、該当のファイルもフォルダも開けるのですが、使用者のPC上で開くことができませんでした。

該当のソースコード

あと、マニュアルで見かけた下記のコードも試したのですが、うまくいきませんでした。
実装の仕方が間違っているのでしょうか?

python

1st.markdown("[Section 1](#section-1)")  ⇐の #section-1 にリンクパスの変数を設定 2 3または、 4 5st.write("check out this [link](link_path)") ⇐の link_path にリンクパスの変数を設定 6

どなたか教えていただけますでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

・上記のネットワーク上に保存したエクセルファイルを、使用者のPC上で直接開きたい

まずこれはstreamlitに限らずブラウザのセキュリティ制限のためできません。
古いブラウザではできましたが。
詳しくは新しい Microsoft Edge での file プロトコルの制限についてを参照ください。
Edgeのみについて、さらに最新のEdgeでは条件付きでできるとの記載がありますが、実際にはポリシー設定の変更かつWebサービスのHTTPS化が必要など、実現させるのは非常に困難です。

さらに詳しくは以下を参照ください。
グループポリシー – Microsoft Edge の設定項目を追加する
Microsoft Edge からのイントラネット ゾーン ファイル URL リンクを Windows エ クスプローラーで開くことを許可する
Run streamlit in https mode

・上記のネットワーク上の保存フォルダを、使用者のPC上で開いて保存ファイルを取りに行けるためのボタン等を作りたい

これについてはdownload_buttonにて、いったん保存されたファイルをダウンロードさせることができると思います。以下単純な例です。

Python

1import streamlit as st 2 3@st.cache 4def get_file(path): 5 with open(path, 'rb') as f: 6 data = f.read() 7 return data 8 9path = r'test.xlsx' # Webサービスで作成、保存したファイルパス 10data = get_file(path) 11st.download_button( label='download', data=data, file_name='dl.xlsx')

投稿2023/01/12 04:19

編集2023/01/12 05:28
can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsutai

2023/01/12 05:25

ご回答、ありがとうございます。 セキュリティの仕様上できないのですね。 ちなみにですが、download_bottun のマニュアルを見ても、CSV、txt ファイルのダウンロードはできそうなのですが、xlsxファイルの 記載がありません。 下記のようにして、CSVのダウンロードはできそうなのですが、エクセルもできるのでしょうか? st.download_button('download',data= csv,file_name=filename,mime='text/csv') ご存じでしたら教えていただけますでしょうか。
can110

2023/01/12 05:43 編集

回答にあげたマニュアルにも記載あるように任意のバイナリ(ファイル)を単純な「application/octet-stream」としてダウンロードさせることができます。 単純例を回答に追記しました。
matsutai

2023/01/12 06:11

ありがとうございます。 おかげさまでよいものができそうです。 関数のところがまだ完全に理解できていないので、勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問