/usr/bin/python ejecutando script con una versión diferente en macOS

/usr/bin/python ejecutando script con una versión diferente en macOS

Estoy ejecutando macOS High Sierra y encontré este comportamiento peculiar del sistema Python.

También lo /usr/bin/xattres un script de Python que imprime un mensaje de error inmediatamente y sale; y /usr/bin/xattr-2.7es el que hace el verdadero trabajo de xattr.

Si ejecuto /usr/bin/xattror xattror /usr/bin/python /usr/bin/xattr, todos se ejecutarán /usr/bin/xattr-2.7en lugar de /usr/bin/xattr. Tenga en cuenta que no hay forma de /usr/bin/xattrredirigir el control a /usr/bin/xattr-2.7. Imprime un mensaje de error inmediatamente.

Pero si cambio de directorio /usr/biny ejecuto /usr/bin/python ./xattro simplemente ./xattr, ejecutarán el real /usr/bin/xattre imprimirán el mensaje de error.

Entonces me pregunto qué magia está involucrada aquí. Parece que el Python que viene preinstalado puede agregar el número de versión al script antes de ejecutar el que especifiqué.

Hacer un seguimiento:

Ejecutar Python desde diferentes ubicaciones también dará como resultado un comportamiento diferente

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.

He adjuntado ambos archivos aquí (https://gist.github.com/hotpxl/f16be705ac8b0cc6b7fbfe951cb68c7b)

Respuesta1

En MacOS, /usr/bin/pythonno es un intérprete de Python, sino un programa llamado "versionador" que intentará seleccionar qué versión del intérprete de Python usar.

También hará trucos como buscar una secuencia de comandos cuyo nombre tenga un sufijo de versión de Python cuando se ejecuten secuencias de comandos desde ubicaciones especiales como /usr/bin.

Esto está parcialmente documentado en elpágina de manual para Python en MacOS, aunque allí no se mencionan los detalles exactos de la búsqueda de scripts con el sufijo.

Ver tambiénesta publicación de blogque explora exactamente el mismo problema que está experimentando y tiene una explicación más detallada que incluye la inspección del binario "versionador" en busca de cadenas especiales.

información relacionada