/usr/bin/python は macOS 上で異なるバージョンのスクリプトを実行します

/usr/bin/python は macOS 上で異なるバージョンのスクリプトを実行します

私はmacOS High Sierraを実行していますが、システムPythonの奇妙な動作を発見しました。

これは/usr/bin/xattr、エラー メッセージをすぐに出力して終了する Python スクリプトであり、/usr/bin/xattr-2.7実際の xattr 作業を実行するスクリプトです。

/usr/bin/xattrまたはxattrまたはを実行すると、 の代わりに/usr/bin/python /usr/bin/xattrこれらがすべて実行されます。が に制御をリダイレクトする方法はないことに注意してください。 すぐにエラー メッセージが出力されます。/usr/bin/xattr-2.7/usr/bin/xattr/usr/bin/xattr/usr/bin/xattr-2.7

しかし、ディレクトリを に変更して/usr/binを実行するか/usr/bin/python ./xattr、単に を実行すると./xattr、実際の が実行され/usr/bin/xattr、エラー メッセージが出力されます。

では、ここにはどんな魔法が関係しているのか疑問に思います。プリインストールされている Python は、指定したスクリプトを実行する前に、スクリプトにバージョン番号を追加できるようです。

フォローアップ:

異なる場所からPythonを実行すると、動作も異なります。

bash-3.2$ cd /usr/bin
bash-3.2$ ./python /usr/bin/xattr
bash-3.2$ cp python /tmp
bash-3.2$ cd /tmp
bash-3.2$ ./python /usr/bin/xattr
python version 2.7.10 can't run /usr/bin/xattr.  Try the alternative(s):

/usr/bin/xattr-2.7 (uses python 2.7)

Run "man python" for more information about multiple version support in
Mac OS X.

両方のファイルをここに添付しました(出典: github.com

答え1

MacOS では、/usr/bin/pythonPython インタープリターではなく、使用する Python インタープリターのバージョンを選択しようとする「versioner」と呼ばれるプログラムです。

また、などの特別な場所からスクリプトを実行するときに、Python バージョンのサフィックスが付いた名前のスクリプトを検索するなどのトリックも実行します/usr/bin

これは部分的に文書化されており、MacOS の Python のマニュアルページただし、接尾辞を持つスクリプトを検索する正確な詳細はそこには記載されていません。

参照このブログ投稿これは、あなたが経験しているのとまったく同じ問題を調査し、「versioner」バイナリを調べて特殊な文字列を探すなど、より詳細な説明が含まれています。

関連情報