①Automaterのアイコンにjpgファイルをドラッグアンドドロップする事でPathを取得する
このためのシェルスクリプトは、自分で書かなくても、「シェルスクリプトを実行」アクションの「入力の引き渡し方法」ポップアップメニューで「引数として」を選ぶと、自動的にコマンドフィールドに記入されます。
上書きして消してしまった場合は、コマンドフィールドのスクリプトを全て削除してから、もういちど「引数として」を選び直せば、再度入力されます。
このときコマンドフィールドには次のようなシェルスクリプトが入力されます。
sh
1for f in "$@"
2do
3 echo "$f"
4done
$@
は引数のすべてを意味します。複数のファイルを同時にドラッグ&ドロップした場合は、すべてのファイルのフルパスのリストがここに格納されていす。
それに対して for ループを実行していますので、$f
にはファイルのパスがひとつずつ順番に入ります。
上記のシェルスクリプトは以下の Python スクリプトに等しいです。
python
1import sys
2for f in sys.argv[1:]:
3 print(f)
完成している Python スクリプトは引数を1つだけとるとのことですので、上記のシェルスクリプトの echo "$f"
の部分を、Python スクリプトに引数としてファイルパスを渡して実行するように、変更すればいいでしょう。
以下のようになります。
sh
1python=/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
2myscript=~/test.py
3
4for f in "$@"
5do
6 "$python" "$myscript" "$f"
7done
実行したいバージョンの Python のパスをフルパスで指定するのが安全です。
自分で書いたスクリプト(上記では test.py)のパスも、必要であればフルパスで指定してください。上記ではチルダ (~) 展開を使って、ユーザディレクトリ直下にあることを示しました。
②取得したPathをPythonファイル内の引数に設定する。引数は1つのみです。
Python では コマンドライン引数は sys.argv
を使って取得することができます。今回は Python に渡される引数は1つと決まっているので、sys.argv[1]
で決め打ちで取り出すことができます(sys.argv[0] にはスクリプト自身のパスが入っています)。
引数にはフルパスが渡されますので、必要に応じてそこからファイル名やディレクトリ名などを取り出すといいでしょう。
以下はテストのために私が書いたスクリプトです。ドラッグ&ドロップしたファイルと同じディレクトリに test.txt というファイルを作って、そこにファイル名とフルパスを書き込んでいます。
python
1import os
2import sys
3
4filepath = sys.argv[1]
5filename = os.path.basename(filepath)
6dirname = os.path.dirname(filepath)
7with open(os.path.join(dirname, "test.txt"), "a") as f:
8 f.write("{}: {}\n".format(filename, filepath))
以下は補足です。
質問中に「Applescriptに慣れておらず」と書かれていますが、シェルスクリプトの間違いかと思います。
AppleScript は macOS に同梱されている、英語に似た構文を持つスクリプト言語で、macOS でのみ実行できるものです。「AppleScriptを実行」アクションを使えば Automator で Applescript を実行することもできますが、参考資料が少なく、構文にもクセのある Applescript を積極的に使う理由はないでしょう。
「シェルスクリプトを実行」アクションの「シェル」ポップアップメニューで「/usr/bin/python」を選べば、Python スクリプトファイルを別に用意しなくても、アクションのコマンドフィールドに直接、Python スクリプトを記入して実行することができます。ただしこの時に実行される Python は macOS に同梱の Python 2.7 になりますので、この方法で実行できる Python スクリプトは、Python 2.7 と標準ライブラリで実行できるスクリプトになります。
(追記)
テスト用に私が作った上記の Automator アプリですが、テストを繰り返していたところ、一度にドラッグ&ドロップしたファイルのうち、一部が処理から漏れたり、ひどい時は全く処理ができなくなったりする不具合が観測されています。少しだけ調査をしてみましたが、原因はわかっていません。I/O が伴う処理なので処理が追いついていないのかと思い、引数をすべてまとめて python 側に渡し、Python 側でループさせてもみましたが、結果は一緒でした。
質問者さんの環境とスクリプトで同様の不具合が発生するかどうかはわかりませんが…。念のため追記しておきます。
(追記の追記)
ドラッグ&ドロップが可能なアプリケーション形式ではなく、右クリック(コンテキストメニュー)から実行が可能なクイックアクション形式で作り直したら、問題なく実行されるようになりました。ドラッグ&ドロップというインタフェースでどうも不具合が生じているようです。クイックアクションは Finder や Touch Bar にも登録して実行できるという利点もあります。質問者さんの環境でも不具合が生じるようなら、クイックアクションでの作成を検討してみてはいかがでしょうか。
Macでクイックアクション・ワークフローを使用する - Apple サポート
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/23 13:06
2021/03/23 18:49 編集
2021/03/26 10:42