/usr/bin/python executando script com versão diferente no macOS

/usr/bin/python executando script com versão diferente no macOS

Estou executando o macOS High Sierra e descobri esse comportamento peculiar do sistema Python.

O mesmo /usr/bin/xattrocorre com um script Python que imprime uma mensagem de erro imediatamente e sai; e /usr/bin/xattr-2.7é aquele que faz o verdadeiro trabalho do xattr.

Se eu executar /usr/bin/xattror xattror /usr/bin/python /usr/bin/xattr, todos eles serão executados /usr/bin/xattr-2.7em vez de /usr/bin/xattr. Observe que não há como /usr/bin/xattrredirecionar o controle para /usr/bin/xattr-2.7. Ele imprime uma mensagem de erro imediatamente.

Mas se eu mudar o diretório para /usr/bine executar /usr/bin/python ./xattrou apenas ./xattr, eles executarão o real /usr/bin/xattre imprimirão a mensagem de erro.

Então eu me pergunto que magia está envolvida aqui. Parece que o Python que vem pré-instalado é capaz de anexar o número da versão ao script antes de executar aquele que especifiquei.

Seguir:

Executar Python em locais diferentes também resultará em comportamentos diferentes

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.

Anexei os dois arquivos aqui (https://gist.github.com/hotpxl/f16be705ac8b0cc6b7fbfe951cb68c7b)

Responder1

No MacOS, /usr/bin/pythonnão é um interpretador Python, mas sim um programa chamado "versionador" que tentará selecionar qual versão do interpretador Python usar.

Ele também fará truques como procurar um script nomeado com um sufixo de versão Python ao executar scripts em locais especiais, como /usr/bin.

Isto está parcialmente documentado nopágina de manual para python no MacOS, embora os detalhes exatos da procura de scripts com o sufixo não sejam mencionados lá.

Veja tambémesta postagem do blogque explora exatamente o mesmo problema que você está enfrentando e tem uma explicação mais aprofundada, incluindo a inspeção do binário "versionador" em busca de strings especiais.

informação relacionada