¿Por qué py y no pyc o pyo?

8

Cuando instalo un paquete de Deb de Python, digamos que python-numpylos archivos son archivos Python simples. ¿Cómo le digo al administrador de paquetes que prefiero usar pyc o incluso mejor archivos pyo?

Adobe
fuente

Respuestas:

12

Ya los tienes y ya los estás usando

Las aplicaciones Python bien empaquetadas se están compilando en .pycarchivos en una secuencia de comandos ejecutada después de la instalación de los archivos. Esto es necesario de acuerdo con las pautas de empaquetado para poder adoptar la instalación de Python que está utilizando en ese momento. Recuerde que los .pycarchivos son muy específicos de su sistema (versión de Python y dependencias).

Por lo tanto, todos los archivos .pyoy .pycestán específicamente excluidos en paquetes y etiquetados como errores por Lintian :

Los archivos fuente compilados de Python no deben incluirse en el paquete. Estos archivos deben eliminarse del paquete y crearse en el momento de la instalación del paquete en la postinst.

Consulte la sección 2.6 de la Política de Debian Python ( Compilación de bytes de módulos ) para obtener más información.

Gravedad: grave, certeza: cierta

En el caso de python-numpyesta compilación de bytes posterior a la instalación, se maneja el gancho debhelper de pycentral. Después de la instalación se ve así:

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc

Un poco más de información de fondo

La razón por la cual estos .pyc/ .pyoarchivos no se compilan en tiempo de ejecución durante el primer inicio de la aplicación como esperaba es la siguiente.

Los archivos de Python se instalan en un directorio de todo el sistema, disponible para todos los usuarios del sistema. Cada vez que un usuario inicia la aplicación, el intérprete de Python puede leer los .pyarchivos, pero no puede escribir en los directorios (por ejemplo /usr/lib/python2.7/dist-packages/). Esto es parte de la seguridad general en todos los sistemas Linux; los usuarios no deberían escribir /usr, solo con derechos de root esto debería ser posible. Por esta razón, los ganchos APT compilarán los archivos de Python por usted en el momento de la instalación; en primer lugar para minimizar el tamaño del paquete, en segundo lugar para poder volver a activar los ganchos una vez que algo cambie en su sistema con respecto a Python, porque se requiere volver a compilar cuando se vuelven incompatibles durante las actualizaciones, por ejemplo.

Sin embargo, esto no afectará a los archivos de Python propiedad del usuario que se compilan en tiempo de ejecución.

gertvdijk
fuente
Por lo tanto, debería /usr/share/pyshared/escribir para mí mismo, para permitir que Python compile archivos en la primera ejecución.
Adobe
44
@Adobe ¿Qué? ¡No! Nunca haga que estos directorios del sistema puedan escribirse para los usuarios. La administración de su paquete ya los compiló para usted (según lo que estaba tratando de decir en mi respuesta). Ahora actualizado para ser más claro al respecto.
gertvdijk
Ahora, que acabo de mirar /usr/lib/python2.7/dist-packages/numpy, hay pycarchivos. Recuerdo que busqué allí en varias instalaciones, y solo había archivos py simples. Así que más o menos "no puedo reproducir el error".
Adobe
La única razón por la .pycque todavía no estaría allí es que el paquete no se instaló por completo. Después de desempacar hay otros pasos a seguir. IIRC, el enlace central de python se ejecuta solo después de instalar todos los paquetes. Por lo tanto, en una sesión APT en ejecución o interrumpida que instala el paquete, la observación que describió se puede hacer probablemente.
gertvdijk