本記事は3部構成のシリーズの中編です。
- 前編(008):なぜ必要か・判定ロジック・Pythonスクリプトの実装
- 中編(本記事):設定のstockphoto.json統合・batファイル作成・Streamlit UIへの組み込み
- 後編(0082):発生したエラーと対処・完成構成と運用フロー
前編(008記事)で shudou_delete.py の実装が完成しました。
本記事ではこのスクリプトをプロジェクトの設定ファイル stockphoto.json に組み込み、
batファイルから呼び出せる形を整えた上で、
007記事で構築したStreamlit UIの新ページとして追加する手順を記録します。
設定をstockphoto.jsonに統合する
このプロジェクトでは、すべてのスクリプトの設定を stockphoto.json に一元管理する方針を取っています(006記事 sec4参照)。
設定ファイルを増やすと「どのスクリプトがどのJSONを見ているか」の管理が煩雑になり、パス変更時の修正漏れも起きやすくなるためです。
今回も専用ファイルは作らず、stockphoto.json に "shudou_delete" セクションを追記しました。
| キー | 説明 | 例 |
|---|---|---|
excel_file | 読み込むExcelファイルのフルパス | bat\results\analysis_results.xlsx |
output_file | 保存先パス(省略または同値なら上書き) | excel_fileと同じ |
search_root | ファイルを再帰検索するルートフォルダ | E:\temp\ai_stockphoto |
filename_col | ファイル名が記録されている列番号(1始まり) | 2(B列) |
status_col | STATUS値を書き込む列番号(1始まり) | 20(T列) |
header_row | ヘッダー行の行番号(1始まり) | 1 |
marker_text | 削除済みと判定した行に書き込む文字列 | 手動削除 |
実際に追記した内容は以下の通りです。
"shudou_delete": {
"_comment": "Settings for shudou_delete.py (手動削除チェック)",
"excel_file": "E:\\temp\\ai_stockphoto\\bat\\results\\analysis_results.xlsx",
"output_file": "E:\\temp\\ai_stockphoto\\bat\\results\\analysis_results.xlsx",
"search_root": "E:\\temp\\ai_stockphoto",
"filename_col": 2,
"status_col": 20,
"header_row": 1,
"marker_text": "手動削除"
}
追記後はJSON構文チェックを必ず行います。カンマの付け忘れや末尾の閉じブレース漏れはよくあるミスです。
python -c "import json; json.load(open('stockphoto.json', encoding='utf-8'))"
エラーなしを確認できれば設定統合は完了です。
今回の追加で stockphoto.json のセクション構成は以下のようになりました。
| セクション名 | 対応するスクリプト | 用途 |
|---|---|---|
upscayl | run_upscayl_filerename.bat | 高解像度化処理の設定 |
analyze | run_analyze_stock.bat | 品質スコア算出・AI-NGチェックの設定 |
exam_ok_ng_collect | run_collect_exam_ok_ng.bat | 審査結果収集・Excel反映の設定 |
furiwake | run_furiwake_okng.bat | OK/NG仕分け処理の設定 |
shudou_delete(今回追加) | run_shudou_delete_ui.bat | 手動削除チェック・STATUS自動記入の設定 |
batファイルの作成
006記事で作成した run_furiwake_ui.bat と完全に同じ構造で run_shudou_delete_ui.bat を作成しました。
このプロジェクトのbatファイルは、Streamlit UIから呼び出すことを前提に以下の設計規約に統一しています。
- 第1引数でログファイルパスを受け取る(Streamlit UI側が渡す)
- スクリプトパスは
%~dp0(batファイル自身のフォルダ)からの相対パスで指定(絶対パスのハードコーディングなし) - Python実行パスは
exam_ok_ng_collect.python_exeをPowerShellで読み込む - 完了マーカー
[DONE]はbat側のみが書く(Python側は書かない)
変更点は furiwake_ui.bat からスクリプト名を差し替えた2か所のみです。
set "PYTHON_SCRIPT=%BAT_DIR%python\shudou_delete.py"
...
echo [DONE] shudou_delete complete. >> "%LOG_FILE%"
配置場所は bat\ フォルダです。PYTHON_SCRIPT の相対パス指定により、どのPCにコピーしても bat\python\shudou_delete.py を正しく参照します。
Streamlit UIへの組み込み
007記事では、batファイル群をStreamlit製GUIから操作できるツールを構築しました。 サイドバーにページを追加してbatを起動し、ログをリアルタイム表示するというパターンが確立されています。 今回はそのパターンに乗る形で「🗑️ 手動削除チェック」ページを追加しました。
実装後の画面は下図のようになります。
app.py への変更は大きく3か所です。
①サイドバーのメニューリストに項目を追加:
page = st.radio("メニュー", [
"📥 データ収集",
"🤖 AI解析",
"🔍 アップスケール",
"📂 OK/NG振り分け",
"🗑️ 手動削除チェック", # 追加
"📄 出力ファイル",
"📋 ログ確認",
"⚙️ 設定",
])
②ページ振り分けのif-elif分岐に追加:
elif page == "🗑️ 手動削除チェック":
page_shudou_delete()
③ページ本体の関数 page_shudou_delete() を追加。UI要素と実行処理の構成は以下の通りです。
| UI要素 | 機能 |
|---|---|
| Excelファイル入力+参照ボタン | tkinter filedialogでExcelファイルをGUI選択 |
| 画像検索ルートフォルダ入力+参照ボタン | tkinter filedialogでフォルダをGUI選択 |
| 「Excelに上書き保存する」チェックボックス | ONなら出力先=入力元、OFFなら出力先を別途入力 |
| 詳細設定(折りたたみ) | filename_col・status_col・marker_textを数値/テキスト入力で変更 |
| ▶ チェック開始ボタン | 変更した設定をstockphoto.jsonへ書き戻した後、batを起動 |
| Progress+Logエリア | batのログファイルをリアルタイムで1行ずつ表示 |
実行部分は既存の run_bat_with_log() ヘルパーをそのまま使います。
このヘルパーはbatを起動してログファイルを監視しながら placeholder に書き込み続ける関数で、
007記事で実装した全ページ共通のロジックです。
「チェック開始」ボタンが押されると、まずUI上の設定値を stockphoto.json に書き戻してからbatを起動します。
ページ固有の処理は「設定の書き戻し先セクション名」と「呼び出すbat名」の2か所のみです。
ログ確認ページのプロセス選択リストにも "🗑️ 手動削除チェック (shudou_delete)" を追加しています。
これにより画面を遷移した後でも「📋 ログ確認」から実行ログをいつでも参照できます。
実際には、下図のようにログが表示されます。
後編(0082記事)では、実装中に発生したエラーの記録と、完成した全体構成・推奨する運用フローをまとめます。
FAQ
UIでパスを変更したらstockphoto.jsonも自動で更新されますか?
はい、更新されます。「▶ チェック開始」ボタンを押すと、UI上で入力した設定値が stockphoto.json の shudou_delete セクションに書き戻されてからbatが起動します。
次回起動時にはその値が読み込まれるため、毎回入力し直す必要はありません。
これは他のページ(AI解析・振り分けなど)と同じ設計です。
batファイルをコマンドラインから直接実行できますか?
run_shudou_delete_ui.bat はStreamlit UIからの呼び出しを前提に設計しており、第1引数にログファイルパスが必要です。
引数なしで実行すると [ERROR] log file path required を出して終了します。
コマンドラインから手動実行したい場合は、以下のように直接Pythonを呼ぶ方が手軽です。
python bat\python\shudou_delete.py bat\stockphoto.json
参照ボタンでフォルダを選択できない場合はどうすればいいですか?
参照ボタンはtkinterのfiledialogを使っています。環境によってはtkinterが利用できない場合があります(Linuxの一部環境など)。 その場合はテキストボックスにパスを直接入力してください。 Windowsで通常の手順でPythonをインストールした環境ではtkinterは標準で利用可能です。