Я использую 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» на наличие специальных строк.