macOSでSpotlightやFinderからPythonスクリプトを実行するための.commandを作成する

hero_image
2023-10-08
2023-10-09

はじめに

macOSでPythonスクリプトを.commandファイルから実行できるようにするとお得満載なのはよく知られていることだ。

ただしスクリプトを何種類も作るような場合だとこの実行ファイルを毎回作るのが結構手間だったりする。

というわけで今回はその実行ファイルの作成を簡単にする.command形式のスクリプトを作成する。

ちなみに先程書いたお得というのは例えば以下のこと

  • 直感的な実行: .commandファイルをダブルクリックするだけでスクリプトを実行できる。
  • Spotlightとの統合: スクリプトをSpotlightから直接起動できる。

前提

% bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin22)
Copyright (C) 2007 Free Software Foundation, Inc.

スクリプトについて

このスクリプトの処理の概要は以下の通り

  • 対象ディレクトリのPythonスクリプトと同名の実行ファイルがなければ作成
  • 作成した実行ファイルに対してユーザーへの実行権限を設定

このスクリプトの実行状態としては以下のようなディレクト構造を想定している

repository-root/
│
├── scripts/               # Pythonスクリプトのディレクトリ
│   ├── script1.py
│   ├── script2.py
│   └── ...
│
└── commands/             # .commandファイルのディレクトリ
    ├── script1.command
    ├── script2.command
    └── ...

なおスクリプトにおける各コマンドの意味についてはコメントを書いたのでここでの解説は省略させて頂く。

スクリプト本体

#!/bin/bash

# 実行時のコマンドの実行パスやexit;の表示をクリアして非表示
clear

# カレントディレクトリをこのスクリプトの場所に設定
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd "$DIR"

# 'scripts' ディレクトリ内のPythonスクリプトを検索
for PYTHON_SCRIPT_PATH in "$DIR/scripts/"*.py; do
    PYTHON_SCRIPT_FILENAME=$(basename "$PYTHON_SCRIPT_PATH" .py)
    COMMAND_NAME="$DIR/commands/$PYTHON_SCRIPT_FILENAME.command"
    
    # .commandファイルが存在しない場合にのみ、新たに作成する
    if [ ! -f "$COMMAND_NAME" ]; then
        # .command ファイルを生成
        # ''はLiteralとしてそのまま、\"\"は変数として展開してから、追記
        echo '#!/bin/bash' > "$COMMAND_NAME"
        echo 'clear' >> "$COMMAND_NAME"
        echo 'DIR="$( cd "$( dirname "$0" )" && pwd )"' >> "$COMMAND_NAME"
        echo 'cd "$DIR/../scripts"' >> "$COMMAND_NAME"
        echo "python3 \"$PYTHON_SCRIPT_FILENAME.py\"" >> "$COMMAND_NAME"
        echo 'echo' >> "$COMMAND_NAME"
        echo 'read -p "Press any key to continue ..."' >> "$COMMAND_NAME"

        # ユーザーへの実行権限を設定
        chmod u+x "$COMMAND_NAME"

        echo "$COMMAND_NAME file created and executable!"
    fi
done

# 空白行を挿入
echo
# 入力を求める前にプロンプトを表示
read -p "Press any key to continue ..."

おわりに

折角なのでこのスクリプトを含め、このブログに関連するスクリプトを以下のリポジトリで公開した。

MITライセンスなので好きに使ってもらって構わない。

PythonScripts

© 2023 ryomazone.dev