/ usr / bin / script de execução python com versão diferente no macOS

0

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

Portanto, /usr/bin/xattr é um script Python que imprime a mensagem de erro imediatamente e sai; e /usr/bin/xattr-2.7 é aquele que faz o trabalho real do xattr.

Se eu executar /usr/bin/xattr ou xattr ou /usr/bin/python /usr/bin/xattr , todos eles executarão /usr/bin/xattr-2.7 em vez de /usr/bin/xattr . Observe que não é possível que /usr/bin/xattr redirecione o controle para /usr/bin/xattr-2.7 . Imprime a mensagem de erro imediatamente.

Mas, se eu alterar o diretório para /usr/bin e executar /usr/bin/python ./xattr ou apenas ./xattr , eles executarão o% real/usr/bin/xattr e imprimirão a mensagem de erro.

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

Acompanhamento:

A execução do Python de diferentes locais resultará em um comportamento diferente também

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 ( link )

    
por Hot.PxL 05.03.2018 / 09:33

1 resposta

3

No MacOS, o / usr / bin / python não é um interpretador Python, mas um programa chamado "versioner", que tentará selecionar qual versão do interpretador Python deve ser usada.

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

Isso está parcialmente documentado na página man do python in MacOS , embora os detalhes de procurar scripts com o sufixo não sejam mencionados lá ...

Veja também esta postagem do blog que explora exatamente o mesmo problema que você está enfrentando e tem um conteúdo mais detalhado explicação incluindo inspecionar o binário "versioner" procurando por strings especiais.

    
por 05.03.2018 / 22:19

Tags