質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AppleScript

AppleScriptは、アップル社が開発しているMac OS用のスクリプト言語。AppleScript本体に限らず、同じ言語で多くのAppleScript対応アプリケーションを操縦することが可能です。 自然言語(英語)に近い構文を持ちます。

Automator

Automatorは、作業を自動化するワークフロー構築ソフトウェア。Macに標準で搭載されています。ドラッグ&ドロップ操作で自動化レシピを作成。任意のショートカットキーで実行することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4363閲覧

AutomaterからPythonへファイルのパスを引数として渡す方法

Ma__and

総合スコア1

AppleScript

AppleScriptは、アップル社が開発しているMac OS用のスクリプト言語。AppleScript本体に限らず、同じ言語で多くのAppleScript対応アプリケーションを操縦することが可能です。 自然言語(英語)に近い構文を持ちます。

Automator

Automatorは、作業を自動化するワークフロー構築ソフトウェア。Macに標準で搭載されています。ドラッグ&ドロップ操作で自動化レシピを作成。任意のショートカットキーで実行することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/03/21 12:52

前提・実現したいこと

Python3+Automater で作業の効率化を図っております。
目的は、多数のjpgファイルを、Automaterのアイコンなどにドラッグアンドドロップすることで、
File名を変更し、各々をファイルに移動させることです。

Python内でコードは完成し作動も確認できました、
しかし、Applescriptに慣れておらず、以下のステップが実現できておりません。

発生している問題・エラーメッセージ

①Automaterのアイコンにjpgファイルをドラッグアンドドロップする事でPathを取得する
②取得したPathをPythonファイル内の引数に設定する。引数は1つのみです。

該当のソースコード

Applescript

1#シェルスクリプトを実行の中に下記を記述しています。入力の引き渡し方法は"引数として”を選択しています。 2cd /作業中ディレクトリ/ 3/python3 test.py

Python3

1... 2path = "ここにドラッグアンドドロップしたpathを入力したい" 3... 4

試したこと

①は試行錯誤の余地がありそうですが、不安があります。
②はGoogleによると、"$@"などの記述が必要になる記載を複数見つけました。
しかし自力での実装は難しそうでした。

ご助言いただけると幸いです、よろしくおねがいします。

補足情報(FW/ツールのバージョンなど)

macOS Big Sur 11.2.2
Python 3.9.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①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/22 08:25

編集2021/03/22 13:36
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ma__and

2021/03/23 13:06

etherbeg様 詳細なご指導をいただきありがとうございます。 ①、②共に、実装できました。 ドラッグアンドドロップでの、jpgからExifデータから日時やカメラの機種名を用いた新規ファイル名の作成とフォルダへの振り分けが可能となり、満足しております。 (補足に関して)ご指摘の通り、「シェルスクリプトに慣れておらず」が正しいです。 言語に関する根本的な理解が不足している事を痛感いたしました。本業の傍ら独学ですが、少しづつ勉強させて頂きたいと思います。 (追記) 当方の環境では、30程度のファイルは、ドラッグアンドドロップで適切作動を致しました。 多数のソリューションを提示頂きありがとうございます、勉強も兼ねて作成してみようと思います。 最後に、初めてTeratailを利用致しましたが、これが無料プラットフォームとは思えません。 今後ともご指導をよろしくおねがいします。
etherbeg

2021/03/23 18:49 編集

回答に丁寧なコメントをいただきありがとうございます。 質問者さんの環境では、ドラッグ&ドロップでも正常に動いているとのことでよかったです。 AppleScript に関しては否定的なことを書いてしまいましたが、利点もありまして、Mac のデスクトップアプリケーションをスクリプティングの対象にできることです。といってもアプリケーション側で AppleScript に対応していないといけないのですが…。Apple 純正のアプリケーションは対応していますし、サードパーティ製のアプリケーションでも、昔から Mac 用のアプリケーションを提供しているデベロッパの製品なら、対応していることが多いです。 アプリケーション > ユーティリティ > スクリプトエディタ.app を開いて、メニューの「ファイル > 用語説明を開く...」を選ぶと、AppleScript に対応しているアプリケーションの一覧と、そのアプリケーションで使うことのできるコマンドの説明を読むことができます。今は JavaScript からも実行できるようになっているみたいですね。そういえば Automator にも「JavaScriptを実行」アクションがありました。
Ma__and

2021/03/26 10:42

ありがとうございます、プログラミングを勉強始めて2ヶ月足らずで、AppleScriptを含む他の言語に関してはド素人です。これから実現したいことに合わせて言語の勉強をすすめて見ようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問