本記事は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_colSTATUS値を書き込む列番号(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 のセクション構成は以下のようになりました。

セクション名対応するスクリプト用途
upscaylrun_upscayl_filerename.bat高解像度化処理の設定
analyzerun_analyze_stock.bat品質スコア算出・AI-NGチェックの設定
exam_ok_ng_collectrun_collect_exam_ok_ng.bat審査結果収集・Excel反映の設定
furiwakerun_furiwake_okng.batOK/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を起動し、ログをリアルタイム表示するというパターンが確立されています。 今回はそのパターンに乗る形で「🗑️ 手動削除チェック」ページを追加しました。

実装後の画面は下図のようになります。

Adobe Stock 自動化ツール手動削除メニュー画面

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)" を追加しています。 これにより画面を遷移した後でも「📋 ログ確認」から実行ログをいつでも参照できます。

実際には、下図のようにログが表示されます。

Adobe Stock 自動化ツール手動削除ログ表示画面

後編(0082記事)では、実装中に発生したエラーの記録と、完成した全体構成・推奨する運用フローをまとめます。

FAQ

UIでパスを変更したらstockphoto.jsonも自動で更新されますか?

はい、更新されます。「▶ チェック開始」ボタンを押すと、UI上で入力した設定値が stockphoto.jsonshudou_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は標準で利用可能です。