Warum py und nicht pyc oder pyo?

8

Wenn ich ein Python-Deb-Paket installiere, sagen wir, python-numpydie Dateien sind einfache Python-Dateien. Wie kann ich dem Paketmanager sagen, dass ich eigentlich lieber pyc oder noch besser pyo-Dateien verwenden würde?

Adobe
quelle

Antworten:

12

Sie haben sie bereits und Sie verwenden sie bereits

Gut verpackte Python-Anwendungen werden .pycin einem Skript zu Dateien kompiliert, das nach der Installation der Dateien ausgeführt wird. Dies ist gemäß den Verpackungsrichtlinien erforderlich, um die derzeit verwendete Python-Installation übernehmen zu können. Denken Sie daran, dass .pycDateien sehr systemspezifisch sind (Python-Version und Abhängigkeiten).

Alle .pyound .pycDateien werden daher in Paketen ausdrücklich ausgeschlossen und von Lintian als Fehler gekennzeichnet :

Kompilierte Python-Quelldateien dürfen nicht im Paket enthalten sein. Diese Dateien sollten aus dem Paket entfernt und zur Paketinstallationszeit im Postinst erstellt werden.

Weitere Informationen finden Sie in Abschnitt 2.6 ( Modul-Byte-Kompilierung ) der Debian Python-Richtlinie .

Schweregrad: ernst, Gewissheit: sicher

Bei python-numpydieser Nachinstallation wird die Bytekompilierung vom Debhelper-Hook von pycentral übernommen. Nach der Installation sieht es so aus:

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

Weitere Hintergrundinformationen

Der Grund, warum diese .pyc/ .pyoDateien beim ersten Start der Anwendung nicht wie erwartet zur Laufzeit kompiliert werden, ist der folgende.

Die Python-Dateien werden in einem systemweiten Verzeichnis installiert, das allen Benutzern im System zur Verfügung steht. Immer wenn ein Benutzer die Anwendung startet, kann der Python-Interpreter die .pyDateien lesen , aber nicht in die Verzeichnisse schreiben (z /usr/lib/python2.7/dist-packages/. B. ). Dies ist Teil der allgemeinen Sicherheit in allen Linux-Systemen. Benutzer sollten nicht schreiben /usr, nur mit Root-Rechten sollte dies möglich sein. Aus diesem Grund kompilieren die APT-Hooks die Python-Dateien zur Installationszeit für Sie. Erstens, um die Paketgröße zu minimieren, zweitens, um die Hooks erneut auslösen zu können, sobald sich auf Ihrem System Änderungen in Bezug auf Python ergeben, da eine Neukompilierung erforderlich ist, wenn sie beispielsweise bei Upgrades inkompatibel werden.

Dies wirkt sich jedoch nicht auf reguläre benutzereigene Python-Dateien aus, die zur Laufzeit kompiliert werden.

gertvdijk
quelle
Also sollte ich /usr/share/pyshared/es mir selbst beschreibbar machen - damit Python beim ersten Ausführen Dateien kompilieren kann.
Adobe
4
@ Adobe Was? Nein! Machen Sie diese Systemverzeichnisse niemals für Benutzer beschreibbar. Ihre Paketverwaltung hat sie bereits für Sie zusammengestellt (gemäß dem, was ich in meiner Antwort sagen wollte). Jetzt aktualisiert, um klarer zu werden.
Gertvdijk
Sie jetzt - das habe ich mir gerade angesehen /usr/lib/python2.7/dist-packages/numpy- gibt es pycDateien. Ich erinnere mich, dass ich dort nach sieben Installationen gesucht habe - und es gab einfach nur py-Dateien. Also kann ich den Fehler nicht reproduzieren.
Adobe
Der einzige Grund, warum das .pycnoch nicht da wäre, ist, dass das Paket nicht vollständig installiert wurde. Nach dem Auspacken sind weitere Schritte erforderlich. IIRC Der Python-Central-Hook wird erst ausgeführt, nachdem alle Pakete installiert wurden. In einer laufenden oder unterbrochenen APT-Sitzung, in der das Paket installiert wird, kann die von Ihnen beschriebene Beobachtung wahrscheinlich gemacht werden.
Gertvdijk