Streamlitでpage_linkを使おうとしたらStreamlitAPIExceptionで怒られた話
Streamlitは、データサイエンスと機械学習向けのアプリケーションを簡単に作成できるフレームワークです。今回は、異なるページ間でのナビゲーションを実装しようとしたらエラーが発生して仕様の理解に詰まったため、備忘録もかねてまとめてみます。この記事では、page_link
を使ってページ間リンクを設定しようとした際に遭遇したStreamlitAPIException
エラーのトラブルシューティングプロセスについて紹介します。
発生した問題
page_linkを使用したら、以下のようなエラーメッセージに直面しました。
StreamlitAPIException: Could not find page: ./movie_app/app.py. Must be the file path relative to the main script, from the directory: ocam_app. Only the main app file and files in the pages/ directory are supported.
Traceback:
File "/home/kinoshita/ocam_app/app.py", line 5, in <module>
st.page_link("./movie_app/app.py", label="映画レビュー分析アプリ", icon="🎬")
トラブルシューティング
ファイルパスの確認
まず、指定したファイルパスが正しいかを確認しました。ファイルパスに問題はなく、movie_app/app.py
は存在しています。しかし、Streamlitはこのファイルをページとして認識していませんでした。
pages
ディレクトリの利用
Streamlitの仕様上、ページ間ナビゲーションはpages
ディレクトリを通じて管理されます。そこで、pages
ディレクトリを作成し、movie_app
フォルダをpages
ディレクトリに移動してみましたが、認識せず。結果として、pages
ディレクトリの直下に、pythonファイル
を設置しないとしないことがわかりました。
シンボリックリンクの試み
直下に配置する前に、movie_app
フォルダをpages
ディレクトリにシンボリックリンクとして追加する方法を試みましたが、先ほどの結論通りうまくいきませんでした。
結論
最終的にわかったこととしては、基点となるapp.py
と同じ階層にpages
ディレクトリを作成し、その中にpythonファイル
を直接入れる形が必須なようですね。
project_root/
│
├── app.py
│
└── pages/
├── movie_app.py
└── (他のページ用Pythonファイル)
基本的にpages
ディレクトリを作成するとサイドバーにリンクが自動表示されます。その機能を使う形としてのみ利用できるイメージですね...
今回の私が作っているアプリは独立したものを一つのページにまとめたりしたいだけなので、この機能よりlink_buttonを使って外部リンク扱いした方がいいかもしれません。