Я использую 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 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 ответ1

3

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .