/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.

Я прикрепил оба файла здесь (https://gist.github.com/hotpxl/f16be705ac8b0cc6b7fbfe951cb68c7b)

решение1

В MacOS /usr/bin/pythonнет интерпретатора Python, а есть программа под названием «versioner», которая попытается выбрать, какую версию интерпретатора Python использовать.

Он также будет выполнять такие трюки, как поиск скрипта, названного с суффиксом версии Python, при запуске скриптов из специальных мест, таких как /usr/bin.

Это частично задокументировано вСтраница руководства по Python в MacOS, хотя точные подробности поиска сценариев с суффиксом там не указаны.

Смотрите такжеэтот пост в блогекоторый исследует ту же самую проблему, с которой вы столкнулись, и содержит более подробное объяснение, включая проверку двоичного файла «versioner» на наличие специальных строк.

Связанный контент