見出し画像

Mac の Python Launcher が思いどおりに動かないので、代替策として Automator でシェルスクリプトをアプリケーション化。

Python 3.10.0 (Release Date: Oct. 4, 2021)では解決した問題です。

前から困っていた問題でしたが、つい今しがた、Python の最新バージョンで解決したことを確認しました。早く気づいていたらこの話はなかったのですが、検討にそこそこ時間をかけてしまいましたので、記事として残したいとと思います。

解決策だけ知りたい方は、最後の項を読んでください。

問題および発生する環境

Python スクリプトをダブルクリックしてもスクリプトが走らない

Python 3.7、3.8、3.9 と MacOS Catalina の組み合わせで発生するようです。現在、自分の Mac は Catalina からアップデートした Big Sur ですが、問題が起きていますので Catalina 以降ということになるのでしょう。

いまひとつな回避策?

とりあえず

Python Launcher の factory settings がこれ↓だったのですが

画像3

こう↓したら直りました。

画像2

回避策までの試行錯誤

Run in a Terminal window が原因だった?これだけが原因とは思えません。

Run in a Terminal window をオフにすることは、問題が解決する直前にやったことなのですが、それよりも前に、実は色々やっていたのです。

スクリプトファイルが正しく Python Launcher に関連付けされていることを確認しました。

スクリプトを右クリックして、このアプリケーションで開く>Python Launcher をやってみました。すると次のダイアログが表示されました。

画像1

OK をクリックしたら、無事に起動、、、と思ったのですが、1度きりでした。

option キーを押しながらスクリプトファイルを Python Launcher に重ねると P reference ダイアログが開くと聞きました。

やってみました。というか、やらなくてもときどきそのようになっていました。

そうやって開いた Preference ダイアログは、Command line: というところスクリプトが実行されないときとは違う内容が表示されていました。

解読したところ、スクリプトがある場所にディレクトリーを変更し、Python3 を使ってスクリプトを実行せよ、といった意味のコマンドでした。

それをコピーしてターミナルで実行したら、正常に処理されました。

option キーを押しながら開いた Python Launcher Preference ダイアログに Run ボタンがありました。クリックしてみました。

Run ボタンは、正常に動作するときと何も起きないときがありました。

たまに、コマンドの最後に次のような文字列が含まれていることがありました。

&& echo Exit status: $? && exit 1

これでしょうか。Python Launcher を終了するコマンドは。いやいや、ターミナルウインドウを閉じるコマンドでしょうか。

Run in a Terminal window をオフしたらなんとなく動くようになりました。

しかし、終わった後、たいてい Python Launcher が閉じません。

問題は、Python Launcher がコマンドを正しく生成できないことにあるのかなと思います。

Python Launcher に代わるもの

Python Launcher が閉じないのはいやなので、なんとかしようと思いました。

Automator でシェルスクリプトを実行するというアイデアをみつけました。

スクリプトをダブルクリックすると一瞬ランチャーの初期設定ウインドウが現れるだけで、スクリプトは実行されないとのこと。

2020-05-16 05:14 に Author: Werner (Auerhahn) として次のように言っています。

I believe, I found a simple way to get what you are looking for:
  
Open Automator and create an app.
Select »execute Shell script«
put in the editor: python3 $1

報告した問題がバグであることが確認されたので、代替だいたい案の登場です。

では、やってみましょう。

画像5

さてシェルスクリプトとは?自分に必要な情報だけ拾い読み。dirname 関数を知りました。

だいぶ試行錯誤しましたが、これで行けそうです。

cd $(dirname $1)
/usr/local/bin/python3 $1

Python Launcher が生成した Command をシェルスクリプトに書き換える方向で考えました。

1行目、Python スクリプトのあるディレクトリーに移動するコマンドです。cd は、Change Directory ですね。

引数 $1 はスクリプトファイルのフルパスですか。スクリプトファイルを Automator で作ったアプリケーションに重ねたときに、第1引数として取得されるものと思います。しかし正確なところはわかりません。

$1 としてファイル名を取得できますので、ファイル名から、ファイル名はフルパスですね、ディレクトリーを表す文字列を取り出します。関数 dirname を使います。なんで $() で囲むのかは、知らないでやっています。

2行目は Python3 でスクリプトファイルを実行するコマンドです。

Automator の初期設定では、入力の引き渡し方法が「stdinへ」でしたが、これを「引数として」に変える必要がありました。これを理解していなかったので、かなり回り道をしてしまいました。

保存するとアプリケーションが出来上がります。そのアイコンに Python スクリプトを重ねると、スクリプトが実行されます。

これで Python Launcher とはお別れです。

スクリプトのダブルクリックだけで実行されないのが不満ですかね。

画像5

関連付けできました。これでスクリプトをダブルクリックするだけで実行できます。

あれ?

自分は、Python Launcher のオプションは必要ないので、これは Python Launcher そのものですね。

名付けて MyPythonLauncher。

名前は、上で紹介したディスカッションからいただきました。

Python 3.10.0 で解決

ふと Python サイドの対策の状況が気になり、最新版を確認したtokoro,Ver 3.10.0 がリリースされていました。

Ver 3.10.0 では問題は起きませんでした。

なぜ、先に気づかなかったのか。

ま、Automator とかシェルスクリプトを齧ることができたので、良いことにしましょう。

解決策まとめ

その1.最新バージョンの Python をインストールする。

その2.Automator で次のシェルスクリプトを実行するアプリケーションを作成する。

cd $(dirname $1)
/usr/local/bin/python3 $1

以上
t.koba



この記事が気に入ったらサポートをしてみませんか?